详解C++构造函数
目录
- 1.作用
- 2.代码举例
- 2.1 示例1:
- 2.2 示例2:
- 3. 使用
- 3.1 使用构造函数初始化
- 3.2 有参数的构造函数
- 3.3 默认的构造函数
- 4. 成员初始化列表
- 例1:正常初始化
- 例2:成员初始化列表
- 为啥推荐成员初始化列表的写法?
- 总结
1.作用 一种特殊类型的方法,在每次实例化对象时运行
2.代码举例
2.1 示例1:
#includeclass A{public:float a, b; void print(){std::cout << a <<" ," << b << std :: endl; }}; int main(){A a; a.print(); return 1; }
运行结果:
文章图片
当我们实例化A,系统为它分配内存,我们没有初始化内存,得到的是内存空间原有的那些东西
2.2 示例2:
当在main中添加 std::cout << a.a << " , " << a.b << std :: endl;
int main(){A a; std::cout << a.a <<" ," << a.b << std :: endl; a.print(); return 1; }
(ubuntu下 vs code )
运行结果:文章图片
不同编译器可能不一样,有的会编译不过报错(未初始化局部变量),原因有待深入…
3. 使用 【详解C++构造函数】
3.1 使用构造函数初始化
#includeclass A{public:float a, b; A (){a = 0.0f; b = 0.0f; }void print(){std::cout << a <<" ," << b << std :: endl; }}; int main(){A a; std::cout << a.a <<" ," << a.b << std :: endl; a.print(); return 1; }
结果:
文章图片
3.2 有参数的构造函数
#includeclass 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 <<" ," << b << std :: endl; }}; int main(){A a(5.0,6.0); std::cout << a.a <<" ," << a.b << std :: endl; a.print(); return 1; }
一个类可以有很多构造函数 前提是参数个数不同或者参数类型不同
类似于同名函数(函数重载 即有相同的函数名,但是有不同的参数个数与参数类型)
A(float c,float d) { }A(int c,int d){}A(float c,float d,float e){}
这里需要注意有参构造的时候注意传值类型
如
float
类型A a(5.0f , 6.0f);
3.3 默认的构造函数
每个类默认有一个空参空实体的构造函数(如果写了构造函数,则默认构造函数就没有了,需要时需手动添加)
A (){}
如果不想使用构造函数有两种方法
// 1 私有化private : A(){}// 2 删掉A() = delete;
4. 成员初始化列表
例1:正常初始化
#includeusing 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 << m_name << " ," << m_age<<" ," <
例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 修饰 namename不可改变*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 << m_name << " ," << m_age<<" ," <
运行结果都一样:
aaa ,1 ,99使用构造函数初始化列表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简单明了。
ccc ,2 ,99.3
初始化列表可以用于全部成员变量,也可以只用于部分成员变量
Student(char *name, int age, float score): m_name(name){m_age = age; m_score = score; }
NOTE:成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关。
为啥推荐成员初始化列表的写法?
#includeusing namespace std; class Example{public:Example(){cout<< "Create Example" << endl; }Example(int x){cout<< "Create Example with "<< x << endl; }}; class A{private:string m_name; // 创建了 Example 的无参构造 对象Example m_Example; public:A(){m_name = "name"; // 创建新的有参构造对象覆盖第一次赋值m_Example = Example(1); }}; int main(int argc, char const *argv[]){A a; return 0; }
结果:
文章图片
A的构造函数换成成员初始化列表的写法
//A() : m_name ("name"),m_Example(Example(1))与下面写法相同A() : m_name ("name"),m_Example(1){}
结果:
文章图片
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- Java|Java OpenCV图像处理之SIFT角点检测详解
- C语言浮点函数中的modf和fmod详解
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 虚拟DOM-Diff算法详解
- LSTM网络层详解及其应用实例
- c++基础概念笔记
- OC:|OC: WKWebView详解
- vue中的条件判断详解v-if|vue中的条件判断详解v-if v-else v-else-if v-show
- Vue组件之事件总线和消息发布订阅详解