作者:2449978963潇潇 | 来源:互联网 | 2023-10-13 16:52
目录1.作用2.代码举例2.1示例1:2.2示例2:3.使用3.1使用构造函数初始化3.2有参数的构造函数3.3默认的构造函数4.成员初始化列表例1:正常初始化例2:
目录
- 1.作用
- 2.代码举例
- 3. 使用
- 3.1 使用构造函数初始化
- 3.2 有参数的构造函数
- 3.3 默认的构造函数
- 4. 成员初始化列表
- 例1:正常初始化
- 例2:成员初始化列表
- 为啥推荐成员初始化列表的写法?
- 总结
%ignore_a_1%
1.作用
一种特殊类型的方法,在每次实例化对象时运行
2.代码举例
2.1 示例1:
#include class a { public: float a, b; void print() { std::cout <
运行结果:
当我们实例化a,系统为它分配内存,我们没有初始化内存,得到的是内存空间原有的那些东西
2.2 示例2:
当在main中添加 std::cout <
int main() { a a; std::cout <
(ubuntu下 vs code )
运行结果:
不同编译器可能不一样,有的会编译不过报错(未初始化局部变量),原因有待深入…
3. 使用
3.1 使用构造函数初始化
#include class a { public: float a, b; a () { a = 0.0f; b = 0.0f; } void print() { std::cout <
结果:
3.2 有参数的构造函数
#include class a { public: float a, b; // 无参构造 a () { a = 0.0f; b = 0.0f; } // 有参构造 a(float c,float d) { a = c; b = d; } void print() { std::cout <
一个类可以有很多构造函数 前提是参数个数不同或者参数类型不同
类似于同名函数(函数重载 即有相同的函数名,但是有不同的参数个数与参数类型)
a(float c,float d) { } a(int c,int d) { } a(float c,float d,float e) { }
这里需要注意有参构造的时候注意传值类型
如 float
类型
3.3 默认的构造函数
每个类默认有一个空参空实体的构造函数(如果写了构造函数,则默认构造函数就没有了,需要时需手动添加)
如果不想使用构造函数有两种方法
// 1 私有化 private : a(){} // 2 删掉 a() = delete;
4. 成员初始化列表
例1:正常初始化
#include using namespace std; class student { private: const char *m_name; int m_age; float m_score; public: // 无参构造 给变量赋定值 student() { m_name = "aaa"; m_age = 1; m_score = 99.0; } // 有参构造 给变量动态赋值 student(const char *name, int age, float score) { m_name = name; m_age = age; m_score = score; } void print () { cout <
例2:成员初始化列表
#include #include using namespace std; class student { private: // string m_name; // char *m_name; const char *m_name; int m_age; float m_score; public: // 无参 成员初始化列表 student() : m_name("bbb") , m_age(2) , m_score(93.0f) { // todo } // 有参 成员初始化列表 /** * const char *name 常量指针 const 修饰*name *name不可改变 * char * const name 指针常量 const 修饰 name name不可改变 * char const *name 常量指针 等同于 const char *name * * 这里不写const 会报警告 但可以编过 * */ student(const char *name, int age, float score) : m_name(name) , m_age(age) , m_score(score) { // todo } void print () { cout <
运行结果都一样:
aaa ,1 ,99
ccc ,2 ,99.3
使用构造函数初始化列表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简单明了。
初始化列表可以用于全部成员变量,也可以只用于部分成员变量
student(char *name, int age, float score): m_name(name){ m_age = age; m_score = score; }
note:成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。
为啥推荐成员初始化列表的写法?
#include using namespace std; class example { public: example() { cout<<"create example" <
结果:
a的构造函数换成成员初始化列表的写法
// a() : m_name ("name"),m_example(example(1)) 与下面写法相同 a() : m_name ("name"),m_example(1) { }
结果:
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注<编程笔记>的更多内容!
需要了解更多c/c++开发分享详解C++构造函数,都可以关注C/C++技术分享栏目—编程笔记