构造函数:
是一种特殊的成员函数,构造函数名与类名一样,没有返回值类型,也没有返回值,构造函数可以重载
创建对象时初始化对象--为对象的成员变量赋初值
在创建一个新对象时,系统会自动调用构造函数,如果没有显示给出构造函数,系统回自动给一个无参的构造函数。
const在c语言中申明变量为只读不能直接修改的变量,在C++中申明一个常量
不能在构造函数中赋值的可以使用成员初始化列表给数据成员赋值(实现构造函数时)
- class MyClass {
-
- public:
- //MyClass() {
- // cout << "构造函数 = " << endl;
- //}//内联函数
- MyClass();
- MyClass(int val);
- const string id;
- void setVal(int val);
- private:
- string nane;
- protected :
- };
-
- MyClass::MyClass() :id( "123") {
- cout << "构造函数 = " << id << endl;
- }
-
- MyClass::MyClass(int val):id("999") {
- cout << "构造函数 = " << id << endl;
- }
-
- void MyClass::setVal(int val) {
- cout << " vasl = " << val << endl;
- }
-
- int main()
- {
- MyClass obj;
- MyClass obj1(5);
- obj.setVal(9);
-
- MyClass *p1 = new MyClass;
- MyClass *p2 = new MyClass(5);
-
- return 0;
- }
析构函数:
是一种特殊的成员函数,主要作用是在对象生命周期结束时进行清理,系统可以自动调用调用析构函数
函数名与类名相同,使用~。没有返回值类型和返回值,也没有参数,是公有属性
没有写时,系统回自动给出默认的析构函数
析构函数可以通过对象主动调用,在系统生命周期结束时,会自动调用析构函数
不是调用析构函数导致对象生命周期结束,而是生命周期结束会自动调用析构函数
先构造的后析构
拷贝构造函数:(拷贝构造-函数)
是一个特殊的构造函数,通过拷贝构造函数完成一个复制的过程。第一个参数是本类对象的引用,后面可以加参数列表
先是构造函数,才可能是拷贝构造函数,可以使用系统默认,也可以自己定义
调用时机:使用一个对象给另一个对象初始化,MyClass x3 = x;
使用一个对象构造另一个对象,MyClass x4 ( x);
函数的参数是类的对象
函数的返回值是类的对象
深拷贝(自己声明了一块内存)与浅拷贝(默认拷贝)
防止默认拷贝发生:写一个私有的拷贝构造函数,但不对他进行定义(主动让程序报错
- class MyClass
- {
- public:
- MyClass();
- MyClass(int val,string name);
- ~MyClass();
-
- MyClass(const MyClass& obj);
- MyClass(const MyClass& obj, int n, int m);
-
- public:
- int m;
- string str;
- private:
-
- };
-
- MyClass::MyClass()
- {
- m = 8797;
- str = "dsfhisdjfyhsd";
- cout << "无参构造函数 = " << m << "--------" << str << endl;
- }
-
- MyClass::MyClass(int val, string name):m(66),str("zh")
- {
- cout << "有参构造函数 = " << val << "--------" << name << "--------"<< m << "--------" << str << endl;
- }
-
- MyClass::~MyClass()
- {
- cout << "析造函数 = " << endl;
- }
-
- MyClass::MyClass(const MyClass& obj)
- {
- m = obj.m;
- str = obj.str;
- cout << "拷贝构造函数 = " << m <<"--------" << str << endl;
- }
-
- MyClass::MyClass(const MyClass& obj,int dsf,int dfgd)
- {
- m = obj.m;
- str = obj.str;
- cout << "拷贝构造函数 = " << m << "--------" << str<<"--------" << dsf<<"--------" << dfgd << endl;
- }
- void test1(MyClass obj) {
- }
-
- MyClass test2() {
-
- #if 0
- MyClass sdfg;
- return sdfg;
- #else
- return MyClass();
- #endif
- }
-
-
-
-
- MyClass x;
- MyClass x2(8888,"ddsfhksdh");
- cout << " --------------------- " << endl;
- MyClass x3 = x;//使用一个对象给另一个对象初始
- MyClass x4 ( x);//使用一个对象构造另一个对象
- MyClass x5(x,657,4355);
- test1(x2);// 函数的参数是类的对象
- test1(x);// 函数的参数是类的对象
- test2();//函数的返回值是类的对象
-
-
- MyClass dfhgf = test2();
)