C++第02课 类与对象 (四)
2021/9/4 9:06:15
本文主要是介绍C++第02课 类与对象 (四),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.拷贝构造
+ 它是一个特殊的构造函数
+ 参数是唯一的:对对象的引用
+ 作用: 实现通过对象去构造对象
namespace myData { class Girl { public: //Girl() { cout << "默认构造" << endl; } Girl(string name) :name(name) { cout << "有参构造" << endl; } //拷贝构造 Girl(Girl& obj) { this->name = obj.name; cout << "拷贝构造" << endl; } //构造委托:允许一个构造函数调用另一个构造函数去初始化数据 Girl() :Girl("小可爱") { cout << "无参构造" << endl; } void print() { cout << name << endl; } Girl& operator=(Girl &obj) { name = obj.name; return obj; } protected: string name; }; } int main() { myData::Girl a("小可爱"); //有参构造 myData::Girl b(a); //拷贝构造 myData::Girl c = a; //拷贝构造 myData::Girl d; //默认构造(无参构造) d = a; //不调用拷贝构造,是运算符重载实现的 return 0; }
2.浅拷贝与深拷贝
+ 默认的拷贝构造函数是浅拷贝
+ 深拷贝,一定拷贝构造函数做了动态内存申请,以及值的复制
class MM { public: MM(const char* name) { this->name = new char[strlen(name) + 1]; strcpy(this->name, name); } //浅拷贝导致内存的重复释放 MM(MM& obj) { this->name = obj.name; } ~MM() { delete[]name; } protected: char* name; }; int main() { MM mm("小可爱"); MM baby(mm); //baby对象释放导致重复释放 return 0; }
修改:
//深拷贝 MM(MM& obj) { this->name = new char[strlen(obj.name) + 1]; strcpy(this->name, obj.name); }
3.类的组合
+ 以另一个类的对象为数据成员称之为类的组合
+ 构造函数写法必须采用初始化参数列表的写法: 构造函数名(形参1,形参2..):类名(形参1),类名(形参2)...{}
+ 构造和析构顺序问题
class A { public : int a; A(int a) :a(a) { cout << a << endl; } }; class B { public: int b; B(int b) :b(b) { cout << b << endl; } }; class C { public: int c; C(int c) :c(c) { cout << c<< endl; } }; class D { public: //分支类的构造顺序只与对象的声明顺序有关 B bobj; A aobj; C cobj; int d; //构造写法:必须采用初始化参数列表,并且必须调用分支类的构造函数 D(int aa,int bb,int cc,int dd):aobj(aa),bobj(bb),cobj(cc),d(dd){ cout << d << endl; } }; int main() { D d(1, 2, 3, 4); //先调用分之类的构造函数,在执行自己的构造函数 //结果:2 1 3 4 return 0; }
4.this指针
+ this指针是代表每一个抽象对象的地址
+ this指针可以避免形参名字和数据成员名相同
+ 一个对象的成员返回对象本身或者对象的地址
这篇关于C++第02课 类与对象 (四)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享