C++ - 构造函数


概念

  • 成员函数的一种
    • 名字与类名相同,可以有参数,不能有返回值(void 也不行)
    • 作用是对对象进行初始化,如给成员变量赋初值
    • 如果定义类的时候没有写构造函数,则编译器生成一个默认的无参数的构造函数
      • 默认的构造函数无参数,不做任何操作.
  • 如果定义了构造函数,则编译器不生成默认的无参数的构造函数.
  • 对象生成的时候构造函数自动被调用. 对象一旦生成, 就再也不能在其上执行构造函数
  • 一个类可以有多个构造函数
  • 注意: 对象初始化时在内存的分配并不是由构造函数来完成,构造函数只是执行对象的初始化的工作。
  • 为什么需要构造函数:
    • 构造函数执行必要的初始化工作,有了构造函数,就不必专门再写初始化函数,也不用再担心忘记调用初始化函数。
    • 有时候对象没被初始化就使用,会导致程序出错。
class Complex{
    private:
            double real,image;
    public:
            void Set(double r,double i);
};
Complex c1;//调用默认生成的构造函数
Complex * pc = new Complex;
class Comples{
    private:
              double real,image;
    public:
              Complex( double r,double i = 0);//自定义构造函数,这个时候就不会再生成默认的构造函数。
};
Complex::Complex( double r,double i){
    real = r;image = i;
}
//调用
Complex c1;//error ,缺少构造函数的参数
Complex *pc = new Complex;//error,没有参数
Complex c1(2); //OK
Complex c1(2,4),c2(3,5); //OK
Complex *pc = new Complex(3,4);//OK
  • 一个类可以有多个构造函数,参数个数或者类型不同
class Complex{
      private:
              double real,imag;
      public:
              void Set(double r,double i);
              Complex(double r,double i);
              Complex(double r);
              Complex(Complex c1,Complex c2);
};
Complex::Complex(double r,double i)
{
      real = r; imag = i;
}
Complex::Complex(double r)
{
      real = r; imag = 0;
}
Complex::Complex(Complex c1, Complex c2)
{
      real = c1.real + c2.real;
       imag = c1.imag + c2.imag;
}
Complex c1(3),c2(1,0),c3(c1,c2);
  • 构造函数在数组中的使用
class CSample{
        int x;
public:
        CSample() {
                cout<<"Constructor 1 Called" <<endl;
         }
         CSample(int n){
                x = n;
                cout<<"Constructor 2 Called"<<endl;
        }
}
//调用
int main(){
//创建 CSample 的数组,由于没有传递任何参数,默认是用无参数的构造函数进行初始化
    CSample array1[2];
    cout<<"step1"<<endl;
//传递了两个参数,所以两个元素都是由有参数的构造函数来进行初始化
    CSample array2[2] = {4,5};
    cout<<"step2"<<endl;
//第一个元素使用有参数,第二个使用无参数
    CSample array3[2] = {3};
    cout<<"step3"<<endl;
//两个都为无参数
    CSample * array4 = new Sample[2];
    delete []array4;
    return();
}
  • 构造函数在对象数组与指针数组之间的区别
class Test {
      public:
              Test(itn n){}
              Test(itn n ,int m){}
              Test(){}
};
//初始化对象数组,每个元素都会调用构造函数,如果有参数调用有参数的构造函数,如果没有参数则调用无参构造函数
Test array1[3] = {1,Test(1,2)};
Test array2[3] = {Test(2,3),Test(1,2),1};
//初始化指针数组,以为数组的内容都是指针,不会自动调用对象的构造函数,只有调用才会生成,不调用指针就会为 NULL。
Test *pArray[3] = {new Test(4),new Test(1,2)};

注意:
- 对象数组初始化,每个数组中的对象都会调用构造函数。
- 指针数组初始化,只有创建过对象的位置的指针会被赋值,否则指针会为 NULL。
- new 创建的对象在堆内存上,可以通过指针在不同对象和函数之间传递,而函数中声明的对象是在栈内存上创建的,要想在作用域外使用必须复制(包括返回值也是赋值),因为作用域一旦结束,栈内存上的对象都析构了。而堆内存上的对象都要手动删除(除非用智能指针),而且手动删除前对象是保证可以被任何拥有该指针的函数访问的。另外堆内存的可用空间比栈内存大的多。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,511评论 1 51
  • 参考链接 一、构造函数 C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。 若没有提供任何构造函...
    Mitchell阅读 2,575评论 0 4
  • 1. C++基础知识点 1.1 有符号类型和无符号类型 当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值...
    Mr希灵阅读 17,969评论 3 82
  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,598评论 1 19
  • 地铁上看了博主文章,顿时觉得那才是,我写了这么久假文章?都在无病呻吟,记录流水账。为了完成而完成坚持的意义就跑偏了...
    ebf8bf373fdf阅读 175评论 0 0