构造函数的调用规则:

系统会提供三个函数,一个是默认的构造函数(无参,函数体为空),一个是拷贝构造函数(无参,函数体为空),一个是析构函数,对类中非静态成员属性简单值拷贝\
如果用户定义了拷贝构造函数,C++不会再提供任何默认拷贝函数
当我们提供了有参的构造函数之后,系统就不会给默认提供构造函数了

class  Person {
public:
Person(int a) {
} //下面这个是拷贝的构造函数
//Person(const Person& m) {
//}
}; void test01() {
Person p1();//这个是没有问题的,默认会使用有参的构造函数
//Person p2;//这是不可以的,当我们定义了有参的构造函数之后,系统就不会再提供默认的构造函数了 Person p2(p1);//系统会提供拷贝的构造函数 }

初始化列表的基本声明:

//初始化列表的基本使用

class  Person {

public:

    /*
//无参的构造函数
Person() :m_a(2), m_b(3), m_c(4) {
//后面相当于是赋值操作,m_a=a,m_b=b,m_c=c
cout << "a=" << m_a << "b=" <<m_b << "c" << m_c << endl;
}
*/ //有参的构造函数
//利用初始化列表,初始化数据
//构造函数后面+:属性(参数),属性(参数)...
Person(int a,int b,int c):m_a(a),m_b(b),m_c(c){ }
int m_a;
int m_b;
int m_c;
}; void test() {
   Person p1;//调用的是无参数的构造函数
Person p2(, , );//调用的是由参数的构造函数
} int main() {
test(); }

例子:使用有参构造函数,初始化列表操作

// 类.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include "pch.h"
#include <iostream>
using namespace std;
#include <string> class Phone {
public:
Phone(string pn) {
phonename = pn;
}
void setname(string name) {
phonename = name;//调用有参构造函数
}
string phonename;
}; class Game {
public:
void setname(string name) {
gamename = name;
}
Game(string gn):gamename(gn) {//当有参数进来的时候,调用game的有参构造函数,执行初始化操作>>gamename=gn;赋值
}
string gamename;
}; class Person {
public:
Person(string name,string phonename,string gamnename):name(name),m_phone(phonename),m_game(gamnename) {
}//在这里相当于是已经传了参数进去,如果是string类型的话相当于是赋值操作name=name,如果是类对象的话相当于是传参数进去,m_phone(phonename)
//相当于调用了m_phone类对象有参构造函数,在执行赋值操作,m_game类对象也是调用了构造函数,初始化操作了 //类对象作为类成员的时候,构造对象先将类对象一一构造,把所有的默认构造函数全部执行一遍,然后构造自己,析构的顺序是相反的
string name;
Phone m_phone;
Game m_game;
void playgame() {
cout << "姓名:" << name << "手机名称" << m_phone.phonename << "游戏名字:" << m_game.gamename << endl;
}
}; void test01() {
//第二种方式:使用有参构造函数,传入参数(如果是类对象的话,传参进去,调用有参构造函数,进行赋值操作),初始化列表操作
Person p1("yun","LOL","三星");//有参构造函数初始化列表
p1.playgame();
//第一种方式:直接是对类对象里面的属性进行赋值操作
/*
Person p1;//使用无参构造函数,对类对象里面的属性(包括类对象)进行操作,类对象的类对象的属性=xxxx
p1.m_game.gamename = "LOL";
p1.m_phone.phonename = "三星";
p1.playgame();
*/
}
int main() {
test01();
}

最新文章

  1. JS代码实现的聊天框
  2. NLog 通过http保存日志
  3. js 漩涡
  4. Vijos 1055 奶牛浴场
  5. 小甲鱼python视频弟十二讲(关于字符串的方法及注释下)
  6. 代码快捷键的设置读取App.config方法
  7. NavigationDrawer+Fragment实现侧滑菜单效果
  8. Java 8 新特性概述
  9. 过滤器(filter)实现
  10. CSS前端开发学习总结、一
  11. express4.x的使用
  12. Python 项目实践一(外星人入侵小游戏)第三篇
  13. markdown的流程图、时序图、甘特图画法
  14. 在WINDOWS服务器下设置MARIADB自动备份的方法
  15. Minify or format javascript file by web or notepad++
  16. 【POI每日题解 #6】KRA-The Disks
  17. zabbix 监控 redis
  18. topK 算法
  19. WORD Application.Documents.Open函数返回null的一种解决方法
  20. dos 磁盘操作系统

热门文章

  1. Windows系统下的TCP参数优化(注册表\TCPIP\Parameters)
  2. Django(二)路由系统、视图、模板
  3. springboot aop 拦截接口执行时间
  4. Linux下一些简单常用命令的总结
  5. python读取导出数据
  6. 第二周博客作业&lt;西北师范大学|李晓婷&gt;
  7. 社区发现算法 - Fast Unfolding(Louvian)算法初探
  8. Ubuntu安装配置protobuf 2.5
  9. Kettle中并行执行测试
  10. Javascript实现base64的加密解密【转】