构造函数constructor 与析构函数destructor(三)
(1)构造函数初始化列表:
1 class Test{
2 int i;
3 public:
4 Test(int vi):i(vi){}//这里的从冒号开始,到右大括号结束,这一段是构造函数初始化列表
5
6 };
构造函数的执行分为两个阶段:(1)初始化阶段 (2)普通计算阶段
初始化是我们定义一个变量,分配内存时直接给变量赋值,例如 int i=10; 而int k; k=10;这样的就不是初始化,是赋值。所以在初始化列表里面的初始化才是真正的初始化,即初始化阶段。而在构造函数内的那些是赋值操作,即普通计算阶段。
(1)const 成员变量的初始化,只能在构造函数初始化列表初始化,其实在其定义处也可以直接初始化
class Object{
const int i;//const成员变量
public:
Object(int vi):i(vi){}//在初始化列表中对const成员变量初始化
};
(2)引用成员变量的初始化,也只能在构造函数初始化列表中进行
class Object{
int N;
int& refN;//引用成员变量
public:
Object():refN(N){}//在构造函数初始化列表处对引用成员变量初始化
};
(3)对象成员的初始化,如果子对象没有默认构造函数,也只能放在外部类的构造函数初始化列表初始化。
class Object{
int m_i;
public:
Object(int vi):m_i(vi){}
};
class Container{
Object obj;
public:
Container(){}
};
int main(){
Container cn;//这句话会报错误,因为在创建Container对象时,会先创建Object的对象,此时会调用Object的默认构造函数 ,但是我们在Object类里面并没有定义默认构造函数。
return ;
}
所以上面的问题有两个解决版本,一是在Object类中添加默认构造函数,二是在Container构造函数初始化列表中,像obj(0)这样初始化obj对象。
如果一个类中包含对象成员,那么再构造时,先构造对象成员,然后再构造外部对象。 并且一个类中包含多个对象成员,这些对象成员的构造顺序是和定义顺序一致的。在析构对象成员时,和定义的顺序相反。
还有就是先析构外部对象,再析构内部子对象。
(4)如果要定义一个对所有对象都是常量的成员,可以采用两种形式 一,是const static int 二,是enum枚举
class Object{
const static int N=;
enum E_Type{
TYPE_A=;
};
int a[N];
int b[TYPE_A];
public:
};
构造函数constructor 与析构函数destructor(三)的更多相关文章
- 构造函数constructor 与析构函数destructor(五)
我们知道当调用默认拷贝构造函数时,一个对象对另一个对象初始化时,这时的赋值时逐成员赋值.这就是浅拷贝,当成员变量有指针时,浅拷贝就会在析构函数那里出现问题.例如下面的例子: //test.h #ifn ...
- 构造函数constructor 与析构函数destructor(一)
构造函数定义:构造函数c++中在创建对象时自动调用,用来初始化对象的特殊函数. (1)构造函数的名字必须与类的名字相同,不能有返回值,哪怕是void 也不行. (2)通常情况下构造函数应声明为公有函数 ...
- 构造函数constructor 与析构函数destructor(四)
拷贝构造函数:拷贝构造函数就是在用一个类对象来创建另外一个类对象时被调用的构造函数,如果我们没有显示的提供拷贝构造函数,编译器会隐式的提供一个默认拷贝构造函数. 拷贝构造函数的定义是X(const X ...
- 构造函数constructor 与析构函数destructor(二)
(1)转换构造函数 转换构造函数的定义:转换构造函数就是把普通的内置类型转换成类类型的构造函数,这种构造函数只有一个参数.只含有一个参数的构造函数,可以作为两种构造函数,一种是普通构造函数用于初始化对 ...
- 从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类
一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝:如果只是分配指针本身的内存,那就是浅拷贝.浅拷贝造成的问题是有两个指针指向同块内存,d ...
- GCC的__attribute__ ((constructor))和__attribute__ ((destructor))
通过一个简单的例子介绍一下gcc的__attribute__ ((constructor))属性的作用.gcc允许为函数设置__attribute__ ((constructor))和__attrib ...
- javascript工厂函数(factory function)vs构造函数(constructor function)
如果你从其他语言转到javascript语言的开发,你会发现有很多让你晕掉的术语,其中工厂函数(factory function)和构造函数(constructor function)就是其中的一个. ...
- C++笔记----构造函数与析构函数(三)
1.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段:初始化段. 普通计算段 2.对象成员及其初始化 #include<iostream> using ...
- 【转】c++析构函数(Destructor)
创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存.关闭打开的文件等,这个函数就是析构函数. 析构函数(Destructor)也 ...
随机推荐
- servlet练习1
1. 编写一个Servlet,当用户请求该Servlet时,显示用户于几点几分从哪个IP(Internet Protocol)地址连线至服务器,以及发出的查询字符串(Query String).查询一 ...
- java二维数组的长度
//多少行 a.length //多少列 a[i].length
- Ubuntu jdk 8 与 6 切换 (安装与配置)
Switch To Oracle JDK8 Switch To Oracle JDK8 1.1 Switch Oracle JDK in the Unbuntu 14.04 Step1 : Downl ...
- leetcode949
public class Solution { public string LargestTimeFromDigits(int[] A) { ); ; ; foreach (var nums in l ...
- 揭秘Java架构技术体系
Web应用,最常见的研发语言是Java和PHP. 后端服务,最常见的研发语言是Java和C/C++. 大数据,最常见的研发语言是Java和Python. 可以说,Java是现阶段中国互联网公司中,覆盖 ...
- bat 批量更改文件名的批处理文件
bat 批量更改文件名的批处理文件 最近下了不少动画,不过文件名都太长,一般都是 [字幕组][名称][集数][语言][分辨率][编码].后缀 这样的格式 我喜欢简单的名字,比如 01.rmvb 之类, ...
- c# 7 vs2017 tuple
var unnamed = (42, "The meaning of life"); var anonymous = (16, "a perfect square& ...
- 贝叶斯vs频率派:武功到底哪家强?| 说人话的统计学·协和八(转)
回我们初次见识了统计学理论中的“独孤九剑”——贝叶斯统计学(戳这里回顾),它的起源便是大名鼎鼎的贝叶斯定理. 整个贝叶斯统计学的精髓可以用贝叶斯定理这一条式子来概括: 我们做数据分析,绝大多数情况下希 ...
- Maven命令行使用 mvn clean package
先把命令行切换到Maven项目的根目录,比如:/d/xxxwork/java/maven-test,然后执行命令: mvn clean package 执行结果如下: [INFO] Scanning ...
- 转)Ubuntu14安装wireshark进行抓包
转自:http://jingyan.baidu.com/article/c74d60009d992f0f6a595de6.html 背景: ubuntu14.04/64位 为了抓包和分析包 安装过程: ...