网站案例库,2017做那些网站致富,一个人做导购网站,python网站开发用什么软件1、作用#xff1a;创建对象时#xff0c;给对象的属性进行初始化
2、特点 #xff08;1#xff09;构造函数与类同名 #xff08;2#xff09;如果没有显式给出构造函数#xff0c;编译器会给出默认的构造函数#xff08;参数为空#xff0c;并且函数体也为空#…1、作用创建对象时给对象的属性进行初始化
2、特点 1构造函数与类同名 2如果没有显式给出构造函数编译器会给出默认的构造函数参数为空并且函数体也为空如果给出任意的构造函数系统默认的构造函数就不存在了 3有返回值但是不写返回值类型也不可以写void 4构造函数是在创建对象时自动调用
3、构造函数支持函数重载
4、构造函数也支持函数默认值
1、无参构造函数
编译器默认的构造函数 类名(){} #include iostreamusing namespace std;class Phone{private: string brand; //品牌 string color; //颜色 double price; //价格 public:void play_music() { cout播放音乐endl; } void play_video(){ cout播放视频endl; }//无参构造函数 Phone(){ cout构造函数endl; }}; int main(){//无参构造函数 Phone p1;return 0; } 2、有参构造函数 #include iostreamusing namespace std;class Phone{private: string brand; //品牌 string color; //颜色 double price; //价格 public:void play_music() { cout播放音乐endl; } void play_video(){ cout播放视频endl; }//有参构造函数 Phone(string a,string b,double c2995){ branda; colorb; pricec; } }; int main(){ //有参构造函数栈内存对象 Phone p2(vivo,红,9); //有参构造函数堆内存对象 Phone*p3new Phone(oppo,蓝,4); delete p3; p3NULL; return 0; } 3、构造初始化列表
构造初始化列表就是构造函数的一种简便写法
注意构造初始化列表与构造函数不能同时出现 #include iostreamusing namespace std;class Person{ private: int id; string name; string sex; bool flag; public://构造初始化列表 Person(int id,string name,string sex,bool flag) :id(id),name(name),sex(sex),flag(flag){} void show(){ coutidnamesexendl; } }; int main(){ Person p1(1001,张三,男,true); p1.show(); return 0; } 4、拷贝构造函数
作用用于实现对象的拷贝创建
特点 1拷贝构造函数与构造函数构成重载拷贝构造函数也是与类同名 2如果不给出拷贝构造函数编译器会给出默认的拷贝构造函数完成对象之间的值复制如果给出拷贝构造函数编译器就不会提供默认的拷贝构造函数 3拷贝构造函数的参数类型是对象的引用或者是const修饰的对象的引用 4拷贝构造函数是在拷贝创建对象时自动调用
注意对象之间是相互独立的对象之间的属性也是相互独立的
4.1 浅拷贝
编译器默认给出的拷贝构造函数完成的就是浅拷贝会完成对象之间简单的值复制 #include iostreamusing namespace std;class Person{ private: int id; string name; string sex; bool flag; public: //构造初始化列表 Person(int id,string name,string sex,bool flag) :id(id),name(name),sex(sex),flag(flag){}//编译器给出的默认的拷贝构造函数手写出来的-----浅拷贝 Person(const Personp){ idp.id; namep.name; sexp.sex; flagp.flag; }void show(){ coutidnamesexendl; } };int main(){ Person p1(1001,张三,男,true); //调用有参的构造函数 p1.show(); // //方法一 // Personppp1; // Person p2(pp); //方法二 Person p2(p1); //调用拷贝构造函数 p2.show();return 0; } 默认拷贝构造函数存在安全隐患如果成员变量是指针类型两个对象的指针类型属性指向同一个内存空间破坏了对象的独立性那么这种拷贝叫浅拷贝
解决方法使用深拷贝
4.2 深拷贝
实现方式创建对象时指针属性要有自己独立的区域拷贝对象时由地址拷贝变成内容拷贝 #include iostream #include string.h using namespace std;class Animal{ private: string kind; //种类 double weight; //体重 char*hobby; //爱好 public: //构造函数----深拷贝 Animal(string k,double w,char*h){ kindk; weightw; //创建对象时指针属性要有自己独立的区域 hobbynew char[20]; strcpy(hobby,h); //使用strcpy前需要引入string.h头文件 } //展示信息 void show(){ cout种类:kind,体重:weight,爱好:hobbyendl;} //kind读接口 string get_kind(){ return kind; } //拷贝构造函数----深拷贝 Animal(const Animalc){ kindc.kind; weightc.weight; //拷贝对象时由地址拷贝变成内容拷贝 hobbynew char[20]; strcpy(hobby,c.hobby); } };int main(){ char h[20]eat fish; Animal cat1(小猫,12,h); //调用有参构造函数 cat1.show();Animal cat2(cat1); //调用拷贝构造函数 cat2.show(); return 0; }4.3 隐式调用构造函数
截止到目前对于构造函数的调用都是显式调用
隐式调用构造函数的出现情况 1等号赋值时等号左侧是对象类型等号右边恰好是对象构造函数所需要的参数类型这时就会把右侧值传入到构造函数中相当于隐式调用构造函数 #include iostream using namespace std;class Test{ private: int number; public: Test(int number) :number(number){} int get_number(){ return number; } };int main(){ // Test t1(100); //显示调用构造函数 // coutt1.get_number()endl; // Test*t2new Test(8); //显示调用构造函数 // coutt2-get_number()endl; // delete t2; // t2NULL; // Test t3(t1); //显示调用构造函数 // coutt3.get_number()endl;Test t49; //隐式调用构造函数 coutt4.get_number()endl; Test t5t4; //隐式调用构造函数 coutt5.get_number()endl; return 0; } 2隐式调用构造函数一般在程序员不自知的情况下产生的需要规避掉可以用explicit关键字屏蔽 class Test{ private: int number; public:explicit Test(int number) :number(number){} int get_number(){ return number; } };