C++面向对象入门(八)编译器提供的构造函数和析构函数

C++中,定义一个类后, 编译器自动提供三个函数:
1,默认构造函数(空实现)
2,默认析构函数(空实现)
3,默认拷贝构造函数(值拷贝)

 

注意事项:

1,若用户自定义有参构造函数, 编译其不再提供默认无参构造函数, 仅提供析构函数和默认拷贝构造函数

2,若用户自定义拷贝构造函数, 编译其不再提供构造函数, 仅提供析构函数

 

示例代码1:提供三个函数

#include <iostream>
#include <string>

using namespace std;

/**
 * 定义一个类后, 编译器自动提供三个函数
 * 1,默认构造函数(空实现)
 * 2,默认析构函数(空实现)
 * 3,默认拷贝构造函数(值拷贝)
 */
class Rider{
private:
    string name;
public:
    /**
     * 设置名字
     * @param name 名字
     */
    void setName(string name){
        this->name = name;
    }

    /**
     * 获取名字
     * @return 返回名字
     */
    string getName(){
        return name;
    }
};

void test(){
    Rider r1;
    r1.setName("zero one");
    Rider r2 = r1;
    cout << "name of Rider r2 is " << r2.getName() << endl;
}
int main() {
    test();
    system("pause");

    return 0;
}

 

代码示例2:自定义有参构造函数,提供析构函数和拷贝构造函数

#include <iostream>
#include <string>

using namespace std;

/**
 * 定义一个类后, 编译器自动提高三个函数
 * 若用户自定义有参构造函数, 编译其不再提供默认无参构造函数, 仅提供析构函数和默认拷贝构造函数
 */
class Rider{
private:
    string name;
public:
    /**
     * 设置名字
     * @param name 名字
     */
    void setName(string name){
        this->name = name;
    }

    /**
     * 获取名字
     * @return 返回名字
     */
    string getName(){
        return name;
    }

    Rider(string name){
        this->name = name;
    }
};

void test(){
    //Rider r1;
    //error: no matching function for call to 'Rider::Rider()'
    Rider r1("zero one");
    Rider r2 = r1;
    cout << "name of Rider r2 is " << r2.getName() << endl;
}
int main() {
    test();
    system("pause");

    return 0;
}

 

代码示例3;自定义拷贝构造函数,仅提供析构函数

#include <iostream>
#include <string>

using namespace std;

/**
 * 定义一个类后, 编译器自动提高三个函数
 * 若用户自定义拷贝构造函数, 编译其不再提供构造函数, 仅提供析构函数
 */
class Rider{
private:
    string name;
public:
    /**
     * 设置名字
     * @param name 名字
     */
    void setName(string name){
        this->name = name;
    }

    /**
     * 获取名字
     * @return 返回名字
     */
    string getName(){
        return name;
    }

    Rider(const Rider& rider){
        this->name = rider.name;
    }
};

void test(){
//    Rider rider;
    //error: no matching function for call to 'Rider::Rider()'
}
int main() {
    test();
    system("pause");

    return 0;
}

 

 
posted @ 2020-08-09 17:38  DNoSay  阅读(341)  评论(0编辑  收藏  举报