C++入门09 -- 拷贝构造函数,深拷贝,浅拷贝,匿名对象,隐

2021-08-14  本文已影响0人  YanZi_33

拷贝构造函数

#include <iostream>

using namespace::std;

class Car {
    int m_price;
    int m_length;
    
public:
    Car(int price = 0,int length = 0) : m_price(price),m_length(length){
        cout << "Car(int price = 0,int length = 0)" << endl;
    }
    
    //1.拷贝构造函数 格式是固定的
    Car(const Car &car){
        this->m_price = car.m_price;
        this->m_length = car.m_length;
        cout << "Car(const Car &car)" <<endl;
    }
    
    //2.与系统的拷贝构造函数 功能相同 初始化列表写法
    Car(const Car &car) : m_price(car.m_price),m_length(car.m_length){
        cout << "Car(const Car &car)" <<endl;
    }
    
    void display(){
        cout << "price = " << this->m_price << endl;
        cout << "length = " << this->m_length << endl;
    }
    
};

int main(int argc, const char * argv[]) {
   
    Car car2(100,10);
    
    //利用car2对象创建了car3,会调用car3对象的拷贝构造函数进行初始化
    Car car3(car2);
    car3.display();
    
    //创建了car6对象,等价于Car car4(car2) 拷贝构造函数
    Car car4 = car2;
    car4.display();
    
    Car car5;
    //这里是赋值操作,没有创建新对象,所以不会调用拷贝构造函数
    car5 = car2;
    
    cout << "&car2 = " << &car2 << endl;
    cout << "&car3 = " << &car3 << endl;
    cout << "&car4 = " << &car4 << endl;
    
    return 0;
}
#include <iostream>

using namespace::std;

class Person {
    int m_age;
    
public:
    //构造函数
    Person(int age = 0) : m_age(age){ }
    //拷贝构造函数
    Person(const Person &person) : m_age(person.m_age){ }
};

class Student : public Person {
    int m_score;
    
public:
    //构造函数
    Student(int age = 0,int score = 0) : Person(age),m_score(score){ }
    //拷贝构造函数 调用父类的拷贝构造函数 初始化成员变量m_age
    Student(const Student &student) : Person(student),m_score(student.m_score){ }
};

int main(int argc, const char * argv[]) {
    
    return 0;
}

浅拷贝,深拷贝

class Car {
public:
    int m_price;
    char *m_name;
    //构造函数
    Car(int price = 0,char *name = NULL) : m_price(price){
        cout << "Car(int price = 0,char *name = NULL)" << endl;
        //字符串要单独处理
        if (name == NULL) return;
        //申请堆空间 存储字符串内容
        this->m_name = new char[strlen(name)+1]{};
        //拷贝字符串内容到堆空间
        strcpy(this->m_name, name);
    }
    
    //拷贝构造函数
    Car(const Car &car) : m_price(car.m_price){
        cout << "Car(const Car &car)" << endl;
        //字符串要单独处理
        if (car.m_name == NULL) return;
        //申请堆空间 存储字符串内容
        this->m_name = new char[strlen(car.m_name)+1]{};
        //拷贝字符串内容到堆空间
        strcpy(this->m_name, car.m_name);
    }
    
    ~Car(){
        cout << "~Car()" << endl;
        if (this->m_name == NULL) return;
        delete [] this->m_name;
        this->m_name = NULL;
    }
    
    void display(){
        cout << "price = " << this->m_price << endl;
        cout << "name = " << this->m_name << endl;
    }
};
int main(int argc, const char * argv[]) {
    
    char name[] = {'b','m','w','\0'};
    //堆对象
    Car *car = new Car(100,name);
    
    cout << car->m_price << endl;
    cout << car->m_name << endl;
    
    delete car;
    
    //栈对象
    Car car1(100,"bmw");
    Car car2 = car1;
    
    return 0;
}
Snip20210814_158.png

对象类型与返回值

#include <iostream>

using namespace::std;

class Car {
    int m_price;
    
public:
    Car(int price = 0) : m_price(price){
        cout << "Car(int price = 0)" << this << "-" << m_price << endl;
    }
    
    Car(const Car &car) : m_price(car.m_price){
        cout << "Car(const Car &car)" << this << "-" << m_price << endl;
    }
};

//对象形参
void test(Car car){
    
}

int main(int argc, const char * argv[]) {
    
    Car car1(10);
    //传参的 会产生一个新的对象 因为拷贝构造函数
    test(car1);
  
    return 0;
}
对象的引用形参
void test(Car &car){
    
}

匿名对象

#include <iostream>

using namespace::std;

class Person {

public:
    
    Person(){
        cout << "Person()" << endl;
    }
    
    Person(const Person &person){
        cout << "Person(const Person &person)" << endl;
    }
    
    ~Person(){
        cout << "~Person()" << endl;
    }
    
    void display(){
        cout << "display()" << endl;
    }
};

void test1(Person person){
    
}


int main(int argc, const char * argv[]) {
    
    Person person;

    //匿名对象
    Person().display();

    test1(Person());
    
    return 0;
}

隐式构造

#include <iostream>

using namespace::std;

class Person {
    int m_age;
public:
    
    Person() : Person(0){
        cout << "Person()" << endl;
    }
    
    Person(int age = 0) : m_age(age){
        cout << "Person(int age = 0)" << endl;
    }
    
    Person(const Person &person){
        cout << "Person(const Person &person)" << endl;
    }
    
    ~Person(){
        cout << "~Person()" << endl;
    }
    
    void display(){
        cout << "display() age = " << this->m_age << endl;
    }
};

void test1(Person person){
    
}

Person test2(){
    return 30;
}
Snip20210814_163.png
#include <iostream>

using namespace::std;

class Person {
    int m_age;
public:
    
    Person() : Person(0){
        cout << "Person()" << endl;
    }
    
    explicit Person(int age = 0) : m_age(age){
        cout << "Person(int age = 0)" << endl;
    }
    
    Person(const Person &person){
        cout << "Person(const Person &person)" << endl;
    }
    
    ~Person(){
        cout << "~Person()" << endl;
    }
    
    void display(){
        cout << "display() age = " << this->m_age << endl;
    }
};

编译器自动生成的构造函数

#include <iostream>

using namespace::std;

class Person {
    
public:
    int m_age;
    
    Person(int age = 0) : m_age(age){
        cout << "Person() " << endl;
    }
};

int main(int argc, const char * argv[]) {
    
    Person person;//没有生成构造函数 
    person.m_age = 10;
    
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读