细说C++中构造函数
来源:互联网 发布:xbox网络teredo不合格 编辑:程序博客网 时间:2024/05/22 13:14
一、构造函数的定义与形式
C++中定义的与类名相同的成员函数,这种成员函数就叫做构造函数。
普通构造函数:
class 类名{ 类名(形参) { 函数的函数体 }};//案例class A(){public: A(int a) { this.a = a; }private: int a;};
拷贝构造函数:
由己存在的对象,创建新对象。也就是说新对象,不由构造器来构造,而是由拷贝 构造器来完成。拷贝构造器的格式是固定的。
class 类名{ 类名(const 类名 &obj) { cout << "拷贝构造" << endl; }};//案例class B{public: B(const B &obj) { cout << "这是拷贝构造函数" << endl; } ~B(){}private:};
2、构造函数的调用与规则
调用
自动调用:一般情况下C++编译器会自动调用构造函数.
手动调用:在一些情况下则需要手工调用构造函数.
规则
- 在对象创建时自动调用,完成初始化相关工作。
- 无返回值,与类名同,默认无参,可以重载,可默认参数。
- 一经实现,默认不复存在。
3、构造函数的类别
我们都知道,构造函数分为无参构造,有参构造和拷贝构造。
形式与案例
class ABC{public: ABC() { a = 0; b = 0; cout << "这是无参构造函数" << endl; } ABC(int a, int b, int c) { this.a = a; this.b = b; this.c = c; cout << "这是有参构造函数" << endl; } ABC(const ABC &another_obj) { cout << "这是拷贝构造函数" << endl } ~ABC() { }private: int a; int b;};
4、构造函数的应用场景
无参与有参构造场景
class A{public: A() { cout << "我是无参构造" << endl; } A(int a) { this a = a; } A(int a, int b =0) { this a = a; this.b = b; }private: int a; int b;};int main(){ A a; //调用无参构造 A a(10);调用只用一个参数的有参构造函数 A a(100, 100), //调用有参构造 return 0;}
拷贝构造函数的应用场景
class NBA{public: NBA() { cout << "我是无参构造" << endl; } NBA(int a, int b) { this.a = a; this.b = b; cout << "我是有参构造" << endl; } NBA(const NBA &obj) { cout << "我是拷贝构造" << endl; n = obj.n; } ~NBA() { cout << "我是析构函数" << endl; } void p_a() { cout << "我是普通成员函数" << endl; cout << "a=" << a << endl; }private: int n;};//拷贝函数第一个应用场景int mian01(){ NBA na(10); NBA nba = na; //调用对象 na 初始化对象 nba return 0;}//拷贝构造应用的第二个场景int main02(){ NBA a(100); NBA nba(a); //调用对象 na 初始化对象 nba return 0;}//拷贝构造应用的第三个场景void func(NBA nba) { nba.p_a();}int main03(){ NBA a(20); func(a); return 0;}//拷贝构造应用的第四个场景NBA func2(void){ NBA temp(100, 200); temp.p_a(); //在此刻 会创建一个匿名的对象来接收temp局部对象。 //通过匿名的拷贝构造函数来构造匿名对象 return temp; }int main04(){ //func2 函数 的返回值是一个Test 是一个匿名的对象, // 当func2返回之后会有一个匿名对象生成,但是这个匿名对象没有任何变量接收,也没有使用 //编译器认为这个匿名没有意义,就会即可给他销毁 func2(); return 0;}//拷贝构造应用的第五个场景int main05(){ //如果在fun2函数返回之后,会创建一个匿名对象, 如果在外部有一个变量给他接收 //实际这个a 就是那个匿名对象, 匿名对象转正了,有了自己的名字叫a //匿名对象转正之后,编译器认为a是一个有意义的对象了,不会立刻销毁 NBA a = func2(); //在此刻销毁的 a return 0;}
五、 二个特殊的构造函数
默认无参构造函数
当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空
默认拷贝构造函数
当类中没有定义拷贝构造函数时,编译器默认提供一个默认拷贝构造函数,简单的进行成员变量的值复制
注意:
当类中定义了拷⻉贝构造函数时,c++编译器不会提供⽆无参数构造数。
当类中定义了有参数构造函数是,c++编译器不会提供⽆无参数构造函数。
在定义类时,只要你写了构造函数,则必须要⽤用。
0 0
- 细说C++中构造函数
- 细说C语言scanf()函数
- C++:构造函数中调用虚函数
- C++:构造函数中调用虚函数
- c#z中静态构造函数
- 细说 class类中的this指针与 构造函数
- 【C++】拷贝构造函数
- C#:静态构造函数
- C++:拷贝构造函数
- explicit构造函数(C++)
- C++:关于构造函数
- C++-构造函数
- C++String构造函数
- c++-转换构造函数
- c++"拷贝构造函数
- C++: 拷贝构造函数
- object-c 构造函数
- C#构造函数
- 【游戏_忍者六道】Windows 下protobuf3.0编译
- 08_python_练习题——乘法表
- 对于 scanner输入流中next() nextline()的认识
- js和JQuery的宽高理解
- [Android app] 慕课网本地视频序列提取另存工具app和源码
- 细说C++中构造函数
- Java中抽象类和抽象方法的区别
- 贪心算法
- 大神级回答exists与in的区别
- Java NIO中的缓冲区Buffer(二)创建-复制缓冲区
- Struts2中的数据类型转换
- c++:String
- 第一章 Shiro简介
- ssm+shiro框架搭建笔记(3)