文章概述
- 构造函数和析构函数的由来?
- 构造函数和析构函数的基本语法
- C++编译器构造析构方案 PK 对象显示初始化方案
- 构造函数的分类以及调用
- 默认的构造函数
- 构造函数调用规则
- 构造函数和析构函数的总结
构造函数和析构函数的由来
类的数据成员不能在类的声明时候初始化,为了解决这个问题? 使用构造函数处理对对象的初始化。构造函数是一种特殊的成员函数,与其他函数不同,不需要用户调用它,而是创建对象的时候自动调用。析构函数是对象不再使用的时候,需要清理资源的时候调用。
构造函数和析构函数的基本语法
a. 构造函数:
- C++中的类需要定义与类名相同的特殊成员函数时,这种与类名相同的成员函数叫做构造函数;
- 构造函数可以在定义的时候有参数;
- 构造函数没有任何返回类型。
- 构造函数的调用: 一般情况下,C++编译器会自动的调用构造函数。特殊情况下,需要手工的调用构造函数。
class Test { public: //构造函数 Test() { } }
b. 析构函数:
- C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的函数是析构函数;
- 析构函数没有参数和没有任何返回类型;
- 析构函数在对象销毁的时候自动调用;
- 析构函数调用机制: C++编译器自动调用。
class Test { ~Test() { } }
C++编译器构造析构方案 PK 对象显示初始化方案
class Test { private: int x; public: Test(int x) { this->x = x; cout << "对象被创建" << endl; } Test() { x = 0; cout << "对象被创建" << endl; } void init(int x) { this->x = x; cout << "对象被创建" << endl; } ~Test() { cout << "对象被释放" << endl; } int GetX() { return x; } }; int main() { //1.我们按照C++编译器提供的初始化对象和显示的初始化对象 Test a(10); Test b; //显示创建对象但是还是调用无参构造函数,之后显示调用了初始化函数 b.init(10); //创建对象数组(使用构造函数) Test arr[3] = {Test(10),Test(),Test()}; //创建对象数组 (使用显示的初始化函数) Test brr[3]; //创建了3个对象,默认值 cout<
0].GetX()<
0].init(
10);
cout<
0].GetX()<
return
0; }
- a. init函数只是一个普通的函数,必须显示的调用;
- b. 一旦由于失误的原因,对象没有初始化,那么结果也是不确定的。没有初始化的对象,其内部成员变量的值是不定的;
- c. 不能完全解决问题。
构造函数的分类以及调用
a. 无参构造函数
class Test { private: int x; public: Test() { this->x=10; } }
无参构造函数的调用: Test a;
b. 有参构造函数
class Test { private: int x; public: Test(int x) { this->x=x; } }
有参数构造函数的调用时机:
- Test a(10); 调用有参数构造函数
- Test b=(2,3); 逗号表达式的值是最后一位,调用有参数构造函数
- Test c=Test(2); 产生一个匿名对象,直接转化成c(只会调用一次有参数构造函数)
c. 拷贝构造函数: 使用对象a初始化对象b
class Test { private: int x; public: Test(const Test& a) { this->x=a.x; } }
拷贝构造函数的调用时机:
class Test { private: int x; public: Test(int x) { this->x = x; cout << "对象被创建" << endl; } Test() { x = 0; cout << "对象被创建" << endl; } ~Test() { cout << "对象被释放" << endl; } Test(const Test& a) { this->x = a.x; cout << "对象被释放(拷贝构造函数)" << endl; } };
- 第一个场景: 用对象a初始化对象b:
Test a(10); //调用的是拷贝构造函数 Test b = a;
- 第二个场景: 用对象a初始化对象b
Test a(10); //调用的是拷贝构造函数 Test b(a)
第一个场景和第二个场景是一样的,用一个对象初始化另一个对象。
- 第三个场景: 实参初始化形参的时候,会调用拷贝构造函数
Test a(10); //实参初始化形参 PrintF(a);
- 第四个场景: 函数返回一个匿名对象
我们分析第四个场景前,我们看看下面的这个全局函数:
//该函数返回的是谁? Test p() { Test c(4); return c; }
Test a=p();
Test b; //匿名对象赋值另一个对象 b = p();
默认的构造函数
构造函数调用规则
构造函数和析构函数的总结
- -
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202631.html原文链接:https://javaforall.net
