1. 默认初始化 如果定义变量时没有指定初值,则变量会被默认初始化,此时变量被赋予了"默认值". 对于类类型的变量来说,初始化都是依靠构造函数来完成的.因此,即使定义某个类的变量(对象)时没有提供初始化式,我们也能通过类的默认构造函数来完成初始化.即,"默认值"由默认构造函数来决定(前提是该类有默认构造函数). 对于内置类型的变量来说,当定义没有初始化式的变量时,系统有时会帮我们初始化变量."默认值"由定义的位置决定:定义于任何函数体之外的变量被…
有两个常见的误解: 1.任何类如果没有定义默认构造函数,就会被合成出一个来. 2.编译器合成的默认构造函数会显式地设定类内每一个数据成员的默认值. 对于第一个误解,并不是任何类在没有显式定义默认构造函数时都会被编译器合成一个默认构造函数. 在以下4种情况下,编译器才会合成默认构造函数,以满足编译器自己的需求(并不是为了满足程序的需求). 一.父类有默认构造函数(default constructor) 如果一个没有任何构造函数的类派生自 “一个有默认构造函数的” 父类,那么这个派生类的默认构造函…
对于C++默认构造函数,我曾经有两点误解: 类如果没有定义任何的构造函数,那么编译器(一定会!)将为类定义一个合成的默认构造函数. 合成默认构造函数会初始化类中所有的数据成员. 第一个误解来自于我学习C++的第一本书 <C++ Primer>,在书中392页:“只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数”. 实际上这句话也没有说错,它说明了默认构造函数定义的必要非充分条件,然而却给当时初学C++的我造成了一定的误解. 第二个误解依旧来自于Primer中的一句话:“合成的…
构造函数的任务是初始化数据成员的,在类中,如果没有显示定义任何构造函数,编译器将为我们创建一个构造函数,称为合成的默认构造函数,合成的默认构造函数使用与变量初始化相同的规则来初始化成员.即当类中的数据成员没有在构造函数中显示初始化,将执行默认初始化: 1.对于内置类型(如int,double,char,bool等)和复合类型(数组,指针),定义任何函数体之外的内置类型或复合类型变量将被初始化0,对于函数体内的内置类型的对象,若没有初始化,其值是未定义的. 2.具有类类型的成员通过运行各自的默认构…
默认构造函数,如果程序员没有为类定义构造函数,那么编译器会在[需要的时候]为类合成一个构造函数,而[需要的时候]分为程序员需要的时候和编译器需要的时候,程序员需要的时候应该由程序员来做工作,编译器需要的时候则由编译器来做工作. C++中,全局变量 / 对象的内存会被清零(如果类对象没有程序员定义的构造函数的时候), 而堆heap 或 栈stack上的变量或对象则不会被清零,其内存只取决于上一次这段内存的值. 而编译器什么情况下会为类合成默认构造函数呢?会在以下四种情况合成默认的构造函数: 1.类…
前言 继前两篇总结了C++对象模型及其内存布局后,我们继续来探索一下C++对象的默认构造函数.对于C++的初学者来说,有如下两个误解: 任何class如果没有定义default constructor,就会被合成出来 编译器合成出来的default constructor会显示设定"class内每一个data member的默认值" 如果读者对这两句话理解颇深,了解里面的陷阱,那么可以不必阅读下去:倘若你有一点点疑惑,那非常好,跟着我一起继续下去! 无用(trivial)的构造函数 一…
类通过一个特殊的构造函数来控制默认初始化过程.这个函数就是默认构造函数.默认构造函数无需不论什么实參. 我们能够显示的定义默认构造函数也能够让编译器为我们生成默认构造函数. 默认构造函数以例如以下规则初始化累的数据成员: 假设存在类内初始值,用它来初始化成员. 否则.默认初始化该成员. class Sales_data { public: std::string bookNo; unsigned units_sold = 0; double revenue = 0.0; }; 如上所看到的.由于…
之前在上C++的课的时候,印象中有那么一句话:如果一个类没有任何构造函数,那么编译器会生成一个默认的构造函数 今天在看<深度探索C++对象模型>的第二章:“构造函数语意学”的时候发现之前听到的说法是错误的. 比如说如下代码: class A {public: int a;}; int main(void) { A a; a.a = 4; A a2; a2.a=5; return 0;}123456789101112按照之前的说法,类A没有任何构造函数,编译器会自动生成一个默认的构造函数,但事实…
笔记C++编译器为编译器需要合成Default Constructor的4种情况. 1,Class A内含Class B对象,Class A没有Default Constructor时会在编译时合成Default Constructor 在编译期间这个Default Constructor会插入调用Class B的Default Constructor的代码 ,如: class B{ public : B(){} }; class A { public: B bb ; /* A() { bb.B…
最近在学习C++对象模型,看的书是侯捷老师的<深度探索C++对象模型>,发现自己以前对构造函数存在很多误解,作此笔记记录. 默认构造函数的误解 1.当程序猿定义了默认构造函数,编译器就会直接使用此默认构造函数 来一个简单的栗子 class Student; class School { public: School(){} ... Student students; }; 我们知道,一个对象,在定义的时候就一定会调用其构造函数.而在我们上面的默认构造函数,明显没有调用students的构造函数…
因标题框有限,题目未显示完整,以下再放一份: 定义一个复数(z=x+iy)类Complex,包含: 两个属性:实部x和虚部y 默认构造函数 Complex(),设置x=0,y=0 构造函数:Complex(int i,int j) 显示复数的方法:showComp()将其显示为如: 5+8i或5-8i 的形式. 求两个复数的和的方法:(参数是两个复数类对象,返回值是复数类对象)public Complex addComp(Complex C1,Complex C2) 求两个复数的差的方法:(参数…
默认构造函数(default constructor)就是在没有显示提供初始化式时调用的构造函数.它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义.若个定义某个类的变量时没有提供初始化式就会使用默认构造函数. 如果用户定义的类中没有显式的定义任何构造函数,编译器就会自动为该类型生成默认构造函数,称为合成的构造函数. 多数情况下,编译器为类生成一个公有的默认构造函数,例如: 1.我们知道,若某类/函数中有成员是类对象(a),那么它会自动调用A的默认构造函数: class A {…
本文是 Inside The C++ Object Model, Chapter 2的部分读书笔记. C++ Annotated Reference Manual中明确告诉我们: default constructor会在需要的时候被编译器产生出来.注意,这里是编译器需要,而不是程序需要.后来的C++ Standard 95修改了这种说法,但是实质上仍是相同的: For class X, if there is none user declared constrator, one default…
待看文章:C++ 合成默认构造函数的真相 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! 类的默认构造函数可以使得在实例化该类的对象时不用提供参数,但是类也可以不含默认构造函数,这样在实例化对象时则必须提供相应的参数. 默认构造函数是没有参数,或者是参数有默认值的构造函数,使得在实例化该类的对象时不用提供参数.如果你没有为你的类提供任何构造函数,那么编译器将自动为你生成一个默认的无参构造函数.一旦你为你的类定义了构造函数,哪怕只是一个,那么编译器将不再生成默认构造函数.比如存在的构…
在早期的C++中.假设须要一些接受一些參数的构造函数,同一时候须要一个不接收不论什么參数的默认构造函数.就必须显示地编写空的默认构造函数.比如: //tc.h class A{ private: int i; public: A(){}; A(int ii): }; 但最好就是接口和声明分离.那么就是例如以下的定义 //tc,h class A{ private: int i; public: A(); A(int ii). }; 这样,就必须在实现中给出空參数构造函数的实现: #include…
通过下面primer中的一道习题,可以更深刻的了解,析构函数,复制构造函数,赋值操作符重载,默认构造函数的使用. 但是我的结果与primer习题解答里面的并不相同,可能是编译器不同的原因导致. // test1107.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <vector> using namespace std; struct Exam{ Exam(){…
本文是 Inside The C++ Object Model, Chapter 2的部分读书笔记. C++ Annotated Reference Manual中明确告诉我们: default constructor会在需要的时候被编译器产生出来.注意,这里是编译器需要,而不是程序需要.后来的C++ Standard 95修改了这种说法,但是实质上仍是相同的: For class X, if there is none user declared constrator, one default…
前言: 如果定义一个类,有其默认的构造函数,则使用new动态实例化一个对象数组,不是件难事,如下代码: #include <memory> #include <iostream> using namespace std; class Animal { public: #if 1 //用于后面演示,无默认构造函数 Animal() : num() { cout << "Animal constructor default" << endl;…
前言: 在C++中,对于一个类,C++的编译器都会为这个类提供四个默认函数,分别是: A() //默认构造函数 ~A() //默认析构函数 A(const A&) //默认拷贝构造函数 A& operator = (const A &) //默认赋值函数. 这四个函数如果我们不自行定义,将由编译器自动生成这四个缺省的函数,下面让我们来看看这四个函数(重点是后两个). 一. 构造函数 构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行.构造…
今天看书,忽然发现自己对默认构造函数/构造函数的理解很模糊,在实际项目中写类时,这些细节问题并没有涉及到.因此,就专门对着<C++ Primer Plus>将默认构造函数/构造函数这一块简单总结一下. 构造函数:C++用于构建类的新对象时需要调用的函数,该函数无返回类型!(注意:是“无”! 不是空!(void)). 默认构造函数:未提供显式初始值时,用来穿件对象的构造函数. 以上是二者的定义,但是单从定义很难对二者进行区别,下面依然看代码. class testClass { public:…
结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部参数名或参数列表调用合适的构造函数.默认构造函数结构体和类在构造过程中会调用一个构造函数,即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数.下面看示例代码: class Rectangle { var width: Double  = 0.0 var height: Double = 0.0 } var rect = Rectang…
在文章开始之前,首先指出对于c++新手的两个常见的误解: 一.任何class如果没有定义default constructor,就会被合成出一个来. 二.编译器合成出来的default constructor会明确设定'“class内每一个data member的默认值”. 首先我们来讨论第一个误解.编译器并不是给任何一个没有user-declared constructor的class合成出default constructor,编译器只会在需要的时候才会给没有user-declared co…
大多数C++书籍都说在我们没有自己定义构造函数的时候,编译器会自动生成默认构造函数.其实这句话我一直也是 深信不疑.但是最近看了一些资料让我有了一点新的认识. 其实我觉得大多数C++书籍之所以这样描述其实是玩了文字游戏的.如果说编译器自动产生的默认构造函数对于我们 的类没有任何作用,也就是说在编译器默认生成的这个构造函数里根本没有任何实质性的代码工作,那么这种默认构 造其实是可有可无的,所以不妨说编译器其实是为每个类生成了默认构造函数的. 在深度探索C++对象模型中讲了四种关于编译器自动生成默认…
C++结构体提供了比C结构体更多的功能,如默认构造函数,复制构造函数,运算符重载,这些功能使得结构体对象能够方便的传值. 比如,我定义一个简单的结构体,然后将其作为vector元素类型,要使用的话,就需要实现上述三个函数,否则就只能用指针了. #include <iostream> #include <vector> using namespace std; struct ST { int a; int b; ST() //默认构造函数 { a = 0; b = 0; } void…
第一种:对象冒充 function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.color); }; } function ClassB(sColor, sName) { this.newMethod = ClassA; this.newMethod(sColor); delete this.newMethod; this.name = sName; this.sayName = f…
# include<iostream>using namespace std;class Time{public:                            //公用成员函数 Time()                                  //默认构造函数 {  hour=13;  minute=25;  sec=46; } Time(int s,int h=10,int m=52) {  hour=h;  minute=m;  sec=s; }// Time(in…
对于一个空类,编译器默认产生4个成员函数:默认构造函数.析构函数.拷贝构造函数和赋值函数.1.构造函数:构造函数是一种特殊的类成员,是当创建一个类的时候,它被调用来对类的数据成员进行初始化和分配内存.构造函数的命名必须和类名完全相同,构造函数可以被重载,可以多个,可以带参数. eg: class A { public: A(){cout<<"无参构造函数";} A(int i){cout<<"带参构造函数";} }; A();//调用默认构造…
C++ defaul construct :缺省构造函数(默认构造函数) 定义:第一种   构造函数没有参数,即是 A()形式的 第二种   构造函数的全部参数由缺省值提供,A(int a=0,int b=0) 编译器添加的默认构造函数的条件:   如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数,函数为空,什么都不做(这只是一种情况而言,此构造函数是trival 派生类和基类的关系: 我们通常说的派生类和基类,我们调用派生类的自定义的构造函数的时候,派生类会自动调用基类中…
构造函数:C++用于构建类的新对象时需要调用的函数,该函数无返回类型!(注意:是“无”! 不是空!(void)). 默认构造函数:未提供显式初始值时,用来穿件对象的构造函数. 以上是二者的定义,但是单从定义很难对二者进行区别,下面依然看代码. class testClass { public: testClass(); /* 默认构造函数 */ testClass(int a, char b); /* 构造函数 */ testClass(,char b='c'); /* 默认构造函数 */ pr…
参考文献: 1.黄邦勇帅 2.http://www.cnblogs.com/graphics/archive/2012/10/02/2710340.html 3.http://blog.csdn.net/pnhuangyu/article/details/12352073 分三个部分: 一.基础 二.什么时候需要默认构造函数 三.默认构造函数将成员初始化为了什么值 一.基础 1.没有参数的构造函数是默认构造函数,默认构造函数只有一个. 2.如果用户没有自己声明构造函数,C++将提供一个默认的构造…