构造函数和析构函数浅谈
2017-03-29 20:06
169 查看
构造函数
构造函数专门为了构造新的对象,将值赋给他们的数据成员,构造函数的参数表示的不是类成员,而是赋给类成员的值,因为此参数名不能与类成员相同。
构造函数并没有声明类型,默认构造函数只可以有一个,可以通过参数不同来重载多个构造函数。
构造函数无法通过对象调用,因为在构造函数构造出对象之前,对象是不存在的。
每次创建类(甚至使用new动态分配内存)时,C++都使用类构造函数。如:
关于默认构造函数:
如果想创建对象,而不显示的初始化,则必须定义一个不接受任何参数的默认构造函数。一般有两种方法,
一、给已有的默认构造函数赋值:
注意调用隐式调用默认构造函数的情况:
一般情况下,既可以通过初始化,也可以通过赋值来设置对象的值,则应采用初始化方式。
C++11列表初始化:
注意事项:
1、有指针成员时,要注意浅拷贝和深拷贝问题。
2、为避免按位拷贝引起的错误,有时将构造函数和 = 赋值操作声明为私有的。
3、C++11接受一个参数的构造函数允许使用赋值语法将对象初始化一个值,如:
当类的构造函数只有一个参数的时候可能隐式调用构造函数,即先隐式转换,然后调用构造函数。系统首先调用类型转换构造函数,将32创建为一个本类的临时对象,然后调用等号运算符重载,将该临时对象赋值给b
析构函数
和构造函数一样,析构函数也可以没有返回值和声明类型。与构造函数不同的是,析构函数没有参数。
一般写法如下:
在多态情况下,一般基类的构造函数声明为非虚,而析构函数声明为虚函数。
构造函数专门为了构造新的对象,将值赋给他们的数据成员,构造函数的参数表示的不是类成员,而是赋给类成员的值,因为此参数名不能与类成员相同。
构造函数并没有声明类型,默认构造函数只可以有一个,可以通过参数不同来重载多个构造函数。
构造函数无法通过对象调用,因为在构造函数构造出对象之前,对象是不存在的。
class A { private: string m_str; int m_num; public: A(const string &str, int num) { m_str = str; m_num = num; } void show() { cout << "m_str::" << m_str << endl << "m_num::" << m_num << endl; }; };显示的调用构造函数:
A a = A("hello world", 1);
A a("hello world",1);
每次创建类(甚至使用new动态分配内存)时,C++都使用类构造函数。如:
A *pA = new A("hello world", 1);上面代码创建一个没有名字的类A的对象,并将该对象的地址赋给指针pA。
关于默认构造函数:
如果想创建对象,而不显示的初始化,则必须定义一个不接受任何参数的默认构造函数。一般有两种方法,
一、给已有的默认构造函数赋值:
A(const string &str = “error”, int num = 0);二、重载一个没有参数的构造函数:
A();因为默认构造函数只有一个,因此不要同时采用这两种方式。
注意调用隐式调用默认构造函数的情况:
A first; //隐式调用默认构造函数 A second(); //这是一个声明,second是一个返回类A类型的函数构造函数不仅可以初始化新的对象,如:
a2 = A("hello world", 1);上面代码通过构造函数创建了一个新的、临时的对象,然后将其内容赋给对象a2.
一般情况下,既可以通过初始化,也可以通过赋值来设置对象的值,则应采用初始化方式。
C++11列表初始化:
A a = {"hello world",1}; A a("hello world",1); A a{};前两个声明调用含参数的构造函数,第三个声明调用默认构造函数。
注意事项:
1、有指针成员时,要注意浅拷贝和深拷贝问题。
2、为避免按位拷贝引起的错误,有时将构造函数和 = 赋值操作声明为私有的。
3、C++11接受一个参数的构造函数允许使用赋值语法将对象初始化一个值,如:
当类的构造函数只有一个参数的时候可能隐式调用构造函数,即先隐式转换,然后调用构造函数。系统首先调用类型转换构造函数,将32创建为一个本类的临时对象,然后调用等号运算符重载,将该临时对象赋值给b
B b = 32;这种特性可能会导致问题。
析构函数
和构造函数一样,析构函数也可以没有返回值和声明类型。与构造函数不同的是,析构函数没有参数。
一般写法如下:
~A();
在多态情况下,一般基类的构造函数声明为非虚,而析构函数声明为虚函数。
相关文章推荐
- 转载 浅谈C#中构造函数与析构函数
- 浅谈自己对构造函数、析构函数、复制构造函数的理解
- C++——类的构造函数、析构函数与赋值函数用法浅谈
- 浅谈C++对象模型——理解构造函数、析构函数执行顺序
- 浅谈构造函数与析构函数的调用顺序
- 2016/3/21 面向对象: ①定义类 ②实例化对象 ③$this关键字 ④构造函数 ⑤析构函数 ⑥封装 ⑦继承
- 构造函数和析构函数
- 关于C++类中的土著民:构造函数,复制构造函数,析构函数
- 构造函数和析构函数能否声明为虚函数?
- 编写类String的构造函数、析构函数和赋值函数
- C#中构造函数和析构函数的用法
- 15、C++基本概念----构造函数和析构函数
- VC++ 描述string类的构造函数和析构函数
- 显式调用构造函数和析构函数
- 析构函数,构造函数
- C#中构造函数和析构函数的用法
- C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针
- php基础知识:类与对象(3) 构造函数和析构函数
- 虚函数与构造函数,析构函数的关系
- 构造函数、赋值操作函数、析构函数