C++学习——类的初始化
文章目录
- 1.类通过构造函数进行数据成员初始化
- 2.类成员初始化方式?
- 3.什么情况下必须使用列表初始化?
- 4.为什么用列表初始化成员变量会快一些?
- 5.派生类构造函数的执行顺序
1.类通过构造函数进行数据成员初始化
一般来说,类中的数据成员是私有的,不能通过对象共有访问的方式对数据成员赋初始值。一般来说,构造函数就是用来用来在创建对象时初始化对象, 为对象数据成员赋初始值。
构造函数是类的一种特殊成员函数,不需要人为调用,而是在建立对象时自动被执行。
2.类成员初始化方式?
赋值初始化,通过在函数体内进行赋值初始化;
列表初始化,在冒号后使用初始化列表进行初始化。
这两种方式的主要区别在于:对于在函数体中初始化,是在所有的数据成员被分配内存空间后才进行的。列表初始化是给数据成员分配内存空间时就进行初始化,
就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须是括号赋值表达式),
那么分配了内存空间后在进入函数体之前给数据成员赋值,
就是说初始化这个数据成员此时函数体还未执行。
列表初始化:
#include<iostream>
using namespace std;class solution {public:solution(int value1,int value2):a(value1),b(value2){}//列表初始化void print() {cout << "a=" << a << " " << "b=" << b << endl;}
private:int a;int b;
};
int main()
{solution s(1, 2);s.print();return 0;
}
赋值初始化:
#include<iostream>
using namespace std;class solution {public:solution(int value1,int value2){a = value1;b = value2;}//列表初始化void print() {cout << "a=" << a << " " << "b=" << b << endl;}
private:int a;int b;
};
int main()
{solution s(1, 2);s.print();return 0;
}
a=1 b=2
3.什么情况下必须使用列表初始化?
必须使用成员初始化的四种情况:
当初始化一个引用成员时;当初始化一个常量成员时;当调用一个基类的构造函数,而它拥有一组参数时;当调用一个成员类的构造函数,而它拥有一组参数时;
#include<iostream>
using namespace std;class solution {public:solution(int& value1,int value2):a(value1),b(value2){}//正确,列表初始化/*solution(int& value1, int value2) {a = value1;b = value2;}//错误,赋值初始化*/void print() {cout << "a=" << a << " " << "b=" << b << endl;}
private:int& a;int b;
};
int main()
{int a = 1;solution s(a, 2);s.print();return 0;
}
4.为什么用列表初始化成员变量会快一些?
赋值初始化是在构造函数当中做赋值的操作,而列表初始化是做纯粹的初始化操作。我们都知道,C++的赋值操作是会产生临时对象的。临时对象的出现会降低程序的效率。
5.派生类构造函数的执行顺序
虚拟基类的构造函数(多个虚拟基类则按照继承的顺序执行构造函数)。基类的构造函数(多个普通基类也按照继承的顺序执行构造函数)。类类型的成员对象的构造函数(按照初始化顺序)派生类自己的构造函数。
#include<iostream>
using namespace std;//虚基类
class A {public:A(int value) :a(value) {cout << "A的初始化" << endl;}
private:int a;
};//基类
class B {public:B(int value) :b(value) {cout << "B的初始化" << endl;}
private:int b;
};//类类型的成员
class C {public:C() {cout << "C的初始化" << endl;}
};//派生类
class D:public B,virtual public A {public:D(int value1, int value2) :B(value1), A(value2) {//初始化顺序和初始化列表的顺序无关,构造函数的初始化顺序按照一定规则进行。cout << "D的初始化" << endl;}
private:C c;
};
int main()
{D d(1, 2);return 0;
}
A的初始化
B的初始化
C的初始化
D的初始化
C++学习——类的初始化相关推荐
- 深入java虚拟机学习 -- 类的加载机制(续)
昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...
- java类成员初始化_简单了解Java类成员初始化顺序
这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...
- python 类 子类 初始化 super
类的初始化方法 在写python代码时候,总能看到初始化__init__的定义,但其实 初始化方法__init__是可选. class A:def __init__(self, x):self.x = ...
- 安卓插件化学习 - 类的加载
安卓插件化学习 - 类的加载 引言 一.类的加载 1. 原理 2. 代码 2.1 宿主apk代码 2.1.1 插件管理器 2.1.2 配置文件 2.1.3 插件初始化 2.1.4 调用插件方法 2.2 ...
- Python零基础速成班-第9讲-Python面向对象编程(上),对象和类、初始化、继承、重写、多态、类方法、组合
Python零基础速成班-第9讲-Python面向对象编程(上),对象和类.初始化.继承.重写.多态.类方法.组合 学习目标 修饰器 面向对象编程:对象和类.初始化.继承.重写.多态.类方法.组合 课 ...
- 7 面向对象(成员变量和局部变量的区别,类作为形式参数的问题,匿名对象,封装,private关键字,this关键字,构造方法,类的初始化过程,static关键字)
1:成员变量和局部变量的区别(理解) (1)在类中的位置不同 成员变量:类中方法外 局部变量:方法定义中或者方法声明上 (2)在内存中的位置不同 成员变量:在堆中 局部变量:在栈中 (3)生命周期不同 ...
- python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)
python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...
- String类的初始化?
在Java程序开发中我们经常会用到字符串.字符串是指一连串的字符,它是由许多单个字符连接而成的,如多个英文字母所组成的一个英文单词. 字符串中可以包含任意字符,这些字符必须包含在一对双引号" ...
- java对类对象初始化_Java类和对象初始化
Java类和对象初始化Tag内容描述: 1.解析 Java 类和对象的初始化过程 由一个单态模式引出的问题谈起 北京高伟达西南分软 Java EE 软件工程师 三年 Java EE 项目经验 行业方向 ...
最新文章
- NB-IoT与LoRa,两马领跑物联网竞赛,谁将最终胜出?
- 树莓派安装oepncv3.43
- 案例研究设计与方法-罗伯_旭进口重新设计-用户体验案例研究
- input发送a.jax_Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型
- C语言简单程序情话,给你一份程序员的“科技情话”,赶在双十一前脱单吧
- 3、构建并安装PHP扩展
- 贪吃蛇博弈算法python_算法应用实践:如何用Python写一个贪吃蛇AI
- python连续读取邮件_Python读取指定日期邮件的实例
- Swift游戏实战-跑酷熊猫 12 与平台的碰撞
- put与putIfAbsent区别
- 逆向动态调试之Ollydbg的使用
- 微博粉丝精灵_微信全国500强、微博粉丝数省内领先……看快报这群年轻人如何运营一个个人气平台...
- java saxreader 生成xml_SAXReader解析xml文件demo
- 透明质酸修饰牛血清蛋白|HA-BSA|荧光FITC标记透明质酸|FITC-peg-BSA
- 用数据分析看泰坦尼克号
- 2022-2023级西安交通大学MBA提前面试(预报名即将开启)6月初
- js三座大山——原型及原型链
- 2021年中国亚马逊耳环市场趋势报告、技术动态创新及2027年市场预测
- 监听器(统计在线人数)
- 在计算机中 IDF MDF是什么意思?
热门文章
- LeetCode 1706. 球会落何处(模拟)
- LeetCode 1382. 将二叉搜索树变平衡(中序遍历+二分递归)
- LeetCode 654. 最大二叉树(递归)
- mysql获取网站绝对路径_Symfony2获取web目录绝对路径、相对路径、网址的方法
- 太原理工电子信焦工程_电气工程及其自动化专业毕业后做什么工作?近几年就业和收入怎样...
- 排序:冒泡排序与选择排序
- Java求最小数用哪个函数_在Java中使用小数进行计算的函数
- docker镜像打包save,载入load,启动run
- 科大讯飞2020完整事件抽取系统(bert+数据集)
- 基于深度学习的信息抽取技术