构造函数
1、构造函数
构造函数的规则和特点:
- 对象实例化时自动调用,我们只需要将初始化的代码写在构造函数内,就能够起到初始化的作用;
- 构造函数名字与类名同名;
- 构造函数没有返回值(不需要加void);
- 构造函数可以有多个重载形式;
- 实例化对象的时候仅用到一个构造函数;
- 当用户没有定义构造函数的时候,编译器会自动生成一个默认的构造函数;
如下所示:
1 class Cstudent { 2 public: 3 /* 无参构造函数 */ 4 Cstudent(void) { 5 this->m_strName = "null"; 6 this->m_strGender = "null"; 7 this->m_iScore = 0; 8 } 9 10 /* 有参构造函数 */ 11 Cstudent(std::string name, std::string gender, unsigned int score = 0) { 12 this->m_strName = name; 13 this->m_strGender = gender; 14 this->m_iScore = score; 15 } 16 17 void SetName(std::string name) { this->m_strName = name; } 18 void SetScore(unsigned int score) { this->m_iScore = score; } 19 void SetGender(std::string gender) { this->m_strGender = gender; } 20 21 std::string GetName(void) { return this->m_strName; } 22 std::string GetGender(void) { return this->m_strGender; } 23 unsigned int GetScore(void) { return this->m_iScore; } 24 private: 25 std::string m_strName; 26 std::string m_strGender; 27 unsigned int m_iScore; 28 };
构造函数的参数可以有默认值,遵从参数默认值的使用规则。
2、默认构造函数
在实例化对象时不需要传递参数的构造函数就称为默认构造函数。例如:
1 class Cstudent { 2 public: 3 /* 默认构造函数 */ 4 Cstudent(void) {this->m_strName = "Jim";} 5 Cstudent(std::string name = "Jim") {this->m_strName = name;} 6 7 private: 8 std::string m_strName; 9 };
3、初始化列表
初始化列表的特性:
- 初始化列表先于构造函数执行;
- 初始化列表只能用于构造函数;
- 初始化列表可以同时初始化多个数据成员;
- const修饰的常量数据成员必须使用初始化列表来完成;
使用初始化列表来初始化数据成员效率高、速度快,推荐使用。使用方法如下所示:
1 class Cstudent { 2 public: 3 Cstudent(std::string name, uint32 score) :m_strName(name), m_iScore(score) { 4 5 } 6 7 private: 8 std::string m_strName; 9 uint32 m_iScore; 10 };
使用一个冒号" : "分隔,多个数据成员初始化之间使用逗号" , "分隔开来。
4、拷贝构造函数
当我们初始化一个类对象的时候,采用的是复制初始化方式(或者是需要进行对象复制的操作)进行初始化,那么就会
执行拷贝构造函数。
- 拷贝构造函数的定义格式: 类名 (const 类名& 变量名) { ... }
- 如果没有自定义的拷贝构造函数则系统自动生成一个默认的拷贝构造函数;
- 在采用复制初始化或者是函数传参时系统自动调用拷贝构造函数,此时将不再调用普通构造函数;
如下所示:
1 #include <string> 2 #include <iostream> 3 4 namespace User { 5 6 class Cstudent { 7 public: 8 /* 普通构造函数 */ 9 Cstudent(void) { std::cout << "Cstudent(void)" << std::endl; } 10 11 /* 拷贝构造函数 */ 12 Cstudent(const Cstudent& stu) { std::cout << "Cstudent(const Cstudent& stu)" << std::endl; } 13 14 private: 15 16 }; 17 18 static void Test(Cstudent stu) { 19 20 } 21 } 22 23 int main(void) 24 { 25 User::Cstudent stu1; 26 User::Cstudent stu2(stu1); 27 User::Cstudent stu3 = stu2; 28 Test(stu1); 29 30 return 0; 31 }
5、总结