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; }
路漫漫其修远兮,吾将上下而求索。