c++面向对象-构造、析构、初始化列表

构造函数

构造函数是指创建对象的时候,会调用的函数。
C++构造函数可以重载,指针或者对象均可调用构造函数。

class Person
{
public:
    int m_age;

    Person() {
        this->m_age = 10;
    }

    Person(int age) {
        this->m_age = age;
    }
};

Person* p0 = new Person(20);
Person p1;
cout << p0->m_age << endl; //输出20
cout << p1.m_age << endl;  //输出10

析构函数

析构函数是指对象即将销毁的时候,会调用的函数,析构函数无参,不可重载,只有一个。

class Person {
public:
    ~Person() {}
};

构造与析构的顺序

构造从父类到子类进行构造,
析构从子类到父类进行析构。
如下打印顺序为:
Person() -> Student() -> ~Student() -> ~Person()

class Person
{
public:
    Person() { cout << "Person()" << endl; }
    ~Person() { cout << "~Person()" << endl; }
};

class Student: Person
{
public:
    Student() { cout << "Student()" << endl; }
    ~Student() { cout << "~Student()" << endl; }
};

初始化列表

初始化列表是一种便捷初始化成员变量的方式,而且只能在构造函数中使用,初始化的顺序只和声明顺序有关。

class Person
{
    int m_age;
    int m_heighht;

    Person(int m_age, int m_height) {
        this->m_age = m_age;
        this->m_heighht = m_heighht;
    }
};

//初始化列表
class Person
{
    int m_age;
    int m_heighht;

    Person(int age, int height): m_age(age), m_heighht(height) {}
};

初始化列表-构造函数调用构造函数

//调用自身构造
class Person
{
public:
    int m_age;
    int m_height;

    Person(int age, int height): m_age(age), m_height(height) {}

    Person() :  Person(18, 180) {}
};

//调用父类构造
class Student: Person
{
    int m_no;

    Student(int age, int height, int no) : Person(age, height), m_no(no) {}
};

拷贝构造函数

  1. 拷贝构造函数是构造函数中的一种。
  2. 拷贝构造函数是指在用已存在的对象创建新对象的时候,调用的构造函数方法。比如在new 类(对象),或者=赋值时会调用。
  3. 拷贝构造函数写法都是固定的,const XX &x。
class Car
{
public:
    int m_price;

    Car(int price) : m_price(price) {}
    Car(const Car& car) {
        this->m_price = car.m_price;
    }
};

Car a(100);
Car b = a;
Car c(a);

深拷贝和浅拷贝

浅拷贝(编译器默认为浅拷贝)

  1. 浅拷贝是将一个对象成员变量的所有值拷贝到另一个对象
  2. 即便成员变量是指针,也会原封不动的拷贝过去,这样就有可能导致内存多次释放的问题。

深拷贝(用户手动控制的)

深拷贝是对象中指针类的成员变量,在构造函数或者拷贝构造函数中,单独申请内存来存放数据,该内存的生命周期由对象来控制,如以下例子即是深拷贝用法:

class Car
{
    void copyName(const char* name) {
        if (name == nullptr) return;

        this->m_name = new char[strlen(name) + 1]{};
        strcpy(this->m_name, name);
    }
public:
    int m_price;
    char* m_name;

    Car(int price, const char* name) : m_price(price) {
        copyName(name);
    }

    Car(const Car& car) {
        this->m_price = car.m_price;
        copyName(car.m_name);
    }

    ~Car() {
        if (this->m_name != nullptr) {
            delete[] this->m_name;
            this->m_name = nullptr;
        }
    }
};

Car* c1 = new Car(10000, "Toyota");
Car* c2 = new Car(15000, "BMW");
Car c3 = *c2;
Car* c4 = new Car(*c1);
delete c1, c2, c4;

隐式调用拷贝构造函数

  1. 函数参数中使用对象型参数,会调用隐式拷贝,增加内存开销,尽量采用引用&来传递,而不要直接使用对象,如下所示,则在传参过程中,调用了拷贝构造。
class Car
{
public:
    int m_price;
    Car() : m_price(0) {}
    Car(int price) : m_price(price) {}
    Car(const Car& car) : m_price(car.m_price) {}
};

//调用该函数的时候,会触发传参  Car car = 传入的car
//因此会调用拷贝构造函数,造成额外的开销
void test1(Car car) {

}
  1. 作为函数的返回值的时候。
Car test2() {
    Car car(20);
    return car;
}
//会调用两次构造函数,
//第一次是Car(int price)
//第二次是Car(const Car& car) : m_price(car.m_price)
Car car2 = test2();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容