C++构造函数

构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数,构造函数的工作是保证每个对象的数据成员具有合适的初值

本文地址:http://www.cnblogs.com/archimedes/p/cpp-constructor.html,转载请注明源地址

C++采用构造函数为对象初始化:

功能:初始化对象

函数名:与类名相同
参数:无

返回值:不指定返回值(不能写void )

位置:通常作为public成员

内容:任意,通常只包含成员赋值语句

调用方法:通常创建对象时自动调用

Time time;
Time time = Time();//OK

C++中的构造函数主要分为四类:

无参构造函数、有参构造函数、构造函数与参数初始化列表、默认构造函数、

无参构造函数

注意:

在实例化对象时自动调用

对象名后不能含有括号"类名  对象名( )"

在构造函数中不仅可以对数据成员赋初值,也可以包含其他语句(不提倡加入与初始化无关的语句)

#include<iostream>
using namespace std;

class Time
{
    public:
        Time();
        void display() const;
    private:
        int m_iHour;
        int m_iMinute;
        int m_iSec;
};
Time::Time()
{
    m_iHour   = 0;
    m_iMinute = 0;
    m_iSec    = 0;
}
void Time::display()const
{
    cout << m_iHour << ":"
       << m_iMinute << ":"
       << m_iSec << endl;
}

int main()
{
    Time time;
    time.display();

    Time obj = Time();
    obj.display();

    Time *p = new Time;
    p->display();
    delete p;
    p = NULL;return 0;
} 

有参构造函数

#include<iostream>
using namespace std;

class Time
{
    public:
        Time(int aHour, int aMinute, int aSec);
        void display() const;
    private:
        int m_iHour;
        int m_iMinute;
        int m_iSec;
};
Time::Time(int aHour, int aMinute, int aSec)
{
    m_iHour   = aHour;
    m_iMinute = aMinute;
    m_iSec    = aSec;
}
void Time::display()const
{
    cout << m_iHour << ":"
       << m_iMinute << ":"
       << m_iSec << endl;
}

int main()
{
    Time time(12,30,20);
    time.display();

    time = Time(0,0,0);
    time.display();

    Time *p = new Time(1,2,3);
    p->display();
    delete p;
    p = NULL;return 0;
} 

由于构造函数可含有参数,因此构造函数可以重载

#include<iostream>
using namespace std;

class Time
{
    public:
        Time();
        Time(int aHour, int aMinute, int aSec);
        void display() const;
    private:
        int m_iHour;
        int m_iMinute;
        int m_iSec;
};
Time::Time()
{
    m_iHour   = 0;
    m_iMinute = 0;
    m_iSec    = 0;

}
Time::Time(int aHour, int aMinute, int aSec)
{
    m_iHour   = aHour;
    m_iMinute = aMinute;
    m_iSec    = aSec;
}

void Time::display()const
{
    cout << m_iHour << ":"
       << m_iMinute << ":"
       << m_iSec << endl;
}

int main()
{
    Time time;
    time.display();
    Time Time(12,30,20);
    Time.display();
    system("pause");
    return 0;
} 

重载构造函数时一定要防止产生二义性。

Time();  //声明无参构造函数Time(int ,int);  //有两个参数的构造函数
Time(int ,int = 10, int=10);//有一个参数不是默认参数… …

Time time1;
Time time2(15); //调用第三个Time time3(15,30); //Error,调用第二个还是第三个?

构造函数与初始化列表

Time::Time(int aHour, int aMinute, int aSec):m_iHour(aHour),m_iMinute(aMinute),m_iSec(aSec){}

注意:

const成员、引用成员及子对象成员必须使用初始化列表初始化

class ConstRef
{
    public:
        ConstRef(int aVal);
    private:
        int   m_iVal;
        const int m_ci;
        int   &m_r;
};
ConstRef::ConstRef(int aVal):m_ival(aVal)
{
    m_ci = aVal;     //Error
    m_r  = m_iVal;  //Error
}

初始化列表只在实现时出现;

class ConstRef
{
    public:
        ConstRef(int aVal);
    private:
        int m_iVal;
        const int m_ci;
        int &m_r;
};
ConstRef::ConstRef(int aVal):m_iVal(aVal), m_ci(aVal), m_r(m_iVal){}
int main()
{
    ConstRef obj(4);
    return 0;
}

构造函数初始化列表不能指定初始化次序

class Point
{
    public:
        Point(int aVal):m_iY(aVal), m_iX(m_iY){} //Error
    private:
        int m_iX;
        int m_iY;
};

按照成员声明的顺序编写构造函数初始化列表。尽量避免使用成员初始化成员。

class Point
{
    public:
        Point(int aVal):m_iX(aVal), m_iY(m_iX){}
    private:
        int m_iX;
        int m_iY;
};

默认构造函数

概念:初始化对象时不提供参数时所调用的构造函数

int main()
{
    Time time1;
    Time time2(); //error
    Time &r = *new Time;
    delete Time;
    return 0;
}

自定义的构造函数、由系统创建的构造函数、含默认参数的构造函数

自定义的构造函数:

#include<iostream>
using namespace std;
class Time
{
    public:
        Time();
        void display() const;
    private:
        int m_iHour;
        int m_iMinute;
        int m_iSec;
};
Time::Time()
{
    m_iHour   = 0;
    m_iMinute = 0;
    m_iSec    = 0;
}
void Time::display()const
{
    cout << m_iHour << ":"
       << m_iMinute << ":"
       << m_iSec << endl;
}
int main()
{
    Time time;
    time.display();

    Time obj = Time();
    obj.display();

    Time *p = new Time;
    p->display();
    delete p;
    p = NULL;
    system("pause");
    return 0;
} 

自定义的构造函数:

类体中若没有构造函数,则系统会生成一个默认构造函数。

#include<iostream>
using namespace std;

class Time
{
    public:
        void display() const;
    private:
        int m_iHour;
        int m_iMinute;
        int m_iSec;
};
void Time::display()const
{
    cout << m_iHour << ":"
       << m_iMinute << ":"
       << m_iSec << endl;
}
int main()
{
    Time time;
    time.display();
    system("pause");
    return 0;
} 

类体中若含有构造函数则系统不会生成默认构造函数;系统创建的默认构造函数就是函数体为空的无参构造函数Time::Time( ){}

含默认参数的构造函数:

#include<iostream>
using namespace std;

class Time
{
    public:
        Time(int aHour=0, int aMinute=0, int aSec=0);
        void display() const;
    private:
        int m_iHour;
        int m_iMinute;
        int m_iSec;
};
Time::Time(int aHour, int aMinute, int aSec)
{
    m_iHour = aHour;
    m_iMinute = aMinute;
    m_iSec = aSec;
}
void Time::display()const
{
    cout << m_iHour << ":"
       << m_iMinute << ":"
       << m_iSec << endl;
}
int main()
{
    Time time1;
    time1.display();
    Time time2(12,30,20);
    time2.display();
    system("pause");
    return 0;
} 

说明:

在声明构造函数时,形参名可以省略(不推荐)
    Time(int = 10,int =10,int =10);

一个类只能有一个默认构造函数
    Time
();  //声明无参构造函数
    Time
(int aX=10,int aY=10,int aZ=10);
    Time box1;  //ERROR

推荐使用默认参数的默认构造函数,以提高代码重用。

一个类中只能含有一个默认构造函数

总结

构造函数的函数名与类名相同,不写返回值,因而不能指定包括void在内的任何返回值类型。

构造函数通常为public

构造函数是成员函数,它可在类体内或类体外实现。

构造函数可以重载,重载时防止产生“二义性”。

最好用参数初始化列表实现构造函数

类外实现构造函数时初始化列表在实现时出现!

无参构造函数和全部参数都含有默认值的构造函数都是默认构造函数

一个类只能含有一个默认构造函数

习惯上要求定义一个含默认参数的默认构造函数,以增强类的通用性

时间: 2024-11-07 00:43:37

C++构造函数的相关文章

【转载】C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CExample {private:     int a;public:     CExample(int b)     { a=b;}     void Show ()     {        cout<

C++程序设计方法3:移动构造函数

移动拷贝构造函数 语法: ClassName(ClassName&&); 目的: 用来偷"临时变量"中的资源(比如内存) 临时变量被编译器设置为常量形式,使用拷贝构造函数无法将资源偷出来("偷"是对原来对象的一种改动,违反常量的限制) 基于"右值引用"定义的移动构造函数支持接受临时变量,能偷出临时变量中的资源: #include <iostream> using namespace std; class Test {

父类的构造函数在对象的生命中扮演的角色

在创建新对象时,所有继承下来的构造函数都会被继承 这代表着每个父类都有一个构造函数(因为每个类至少都会有一个构造函数),并且每个构造函数都会在对象创建时执行. 执行new的指令是个大事件,因为他会启动构造函数的连锁反应.还有,就算是抽象的类也有构造函数.虽然你不能对抽象函数执行new操作,但是抽象函数还是父类,因此它的构造函数会在具体的子类创建实例时被执行. 在构造函数中用super调用父类的构造函数部分(注意:调用super() 方法是调用父类构造函数的唯一方法).要记得子类会根据父类的状态进

JavaScript中的构造函数

function Accom(){};    //创建一个构造函数 //创建两个对象 var house=new Accom(); var apartment=new Accom(); 通过构造函数创建的对象有一个属性constructor,这个属性指向创建该对象时所用的Javascript构造函数. house.constructor===Accom;  或者   house instanceof Accom;     //true JavaScript中的每个构造函数都有一个prototyp

javascript中的构造函数和原型及原型链

纯属个人理解,有错误的地方希望大牛指出,以免误人子弟 1.构造函数: 构造函数的作用 : 初始化由new创建出来的对象    new 的作用: 创建对象(空对象) new 后面跟的是函数调用,使用new来调用函数,跟普通的直接调用函数主要的不同: 就是 this 的指向不同了 , 再就是 会自动的返回新创建的对象 什么是原型?        原型的作用:就是为了实现继承!  一个对象的原型就是它的构造函数的prototype属性的值. 在讨论原型的时候,是指的 对象和原型对关系 prototyp

Resolve Type中构造函数传值

1 1 class Test 2 { 3 4 private ITeacher _teacher; 5 private IStudent _student; 6 public Test(ITeacher tea, IStudent stu) 7 { 8 _teacher = tea; 9 _student = stu; 10 } 11 } 2 1 class Student:IStudent 2 { 3 4 public Student() 5 { 6 int i = 1; 7 } 8 9 10

构造函数、拷贝构造函数、赋值操作符

对于这样一种类与类之间的关系,我们希望为其编写“深拷贝”.两个类的定义如下: class Point { int x; int y; }; class Polygon : public Shape { Point *points; }; 1. 构造函数 //构造函数 Polygon(const Point &p) : _point(new Point) { this->_point->x = p.x; this->_point->y = p.y; } 2. 拷贝构造函数 /

JAVA_SE基础——29.构造函数

黑马程序员入学Blog... jvm创建Java对象时候需要调用构造器,默认是不带参数的.在构造器中,你可以让jvm帮你初始化一些参数或者执行一系列的动作. 它是对象创建中执行的函数,及第一个被执行的方法 特点: 1.函数名与类名相同. 2.不用定义返回值类型. 3.没有具体的返回值. P.S. 在构造函数前面加上返回值就只是一般函数了. 作用:给对象进行初始化. class Person{ private String name ; private int age ; //定义一个Person

C++ 构造函数和析构函数

构造函数: 作用: 1)分配空间:分配非静态数据成员的存储空间 2)初始化成员:初始化非静态数据成员 分配空间: 1)含有指针变量,需要程序员显式申请空间(使用new申请) 2)非指针变量:由系统自动分配空间 初始化成员: 1)使用赋值语句初始化:一般的变量 2)使用表达式表初始化:一般的变量 +  Const成员,引用成员,对象成员 调用时机:在定义对象的时候,系统自动调用构造函数 1)对象被创建时,自动调用构造函数 Coord p1(1); Coord p2=1;  //此时也会调用构造函数

构造函数和析构函数是否可以被重载

构造函数可以被重载,因为构造函数可以有多个且可以带参数. 析构函数不可以被重载,因为析构函数只能有一个,且不能带参数.