[C++] 构造函数的用法

因为C++的三大特性之一是数据隐藏,成员变量都是私有的,所以类不能像结构那样直接初始化,而需要构造函数,将需要初始化的数据在对象中实现初始化。构造函数与其他函数不同,没有返回值,也不能被对象调用(只是用于对象的初始化)。实质是类的隐式初始化,在对象初始化的时候,自动被调用。

构造函数可以分为一般的构造函数(分有参和无参)和用于对象复制的复制构造函数(又称拷贝构造函数)。

使用new来创建对象的时候,对象实际上没有名称,得到一个指向对象地址的指针,可以通过该指针管理对象。

#include <iostream>  
using namespace std;  
  
class Test  
{  
public:  
    Test()                     //无参构造函数,也叫默认构造函数,如果形参列表不为空且每个形参都有默认值,则也称为默认构造函数  
    {   
      cout<<"struct1 of Test!"<<endl;
    }  
    
    Test(const Test &another)  //拷贝构造函数  
    { 
        m_a=another.m_a;
        cout<<"struct2 of Test!"<<endl;
    }  
    
    Test(int a) :m_a(a)       //有参构造函数,非默认构造函数,如果参数列表中所有的形参都有默认值,则是默认构造函数  
    {  
        m_a = a;
        cout<<"struct3 of Test!"<<endl;
    }
  
    void print()  
    {  
        cout << " m_a = " << m_a << endl;  
    }  

private:  
    int m_a;      
};   

void main()  
{  
    Test t1(10);         //括号法  //c++编译器自动调用这个类的有参构造函数  
    t1.print();  
    Test t2 = 20;        //等号法  //c++编译器自动调用这个类的有参构造函数  
    t2.print();  
    Test t3=Test(30);    //手工法 //程序员手工的调用构造函数 进行对象初始化
    t3.print();
}  

 当且仅当没有任何构造函数时,编译器才会提供默认构造函数,一旦用户定义了非默认构造函数而不提供默认的构造函数,试图使用默认构造形式初始化对象时,会导致错误(编译器不再提供默认构造函数)。

C++11中的列表初始化

C++11标准支持的列表初始化,需要提供与某个构造函数的参数列表匹配的内容,并将其括起来即可。

 

Test test = {"test construct", 0, 0.0}; //匹配Test::Test(const tring &str, int a, double b)
Test test = {"test const"}; //匹配Test::Test(const string &str, int a, double b)
Tets test = {};    //匹配Test::test()

const成员函数

类方法结尾加上const修饰符后成为const成员函数,在C++的规则中,当方法不修改调用对象时,最好将其声明为const型的。试图用一个const型的对象调用一个非const型的成员函数会被编译器报告错误,因为编译器不能保证该方法不会改变调用对象。

 

 

this指针

 

posted @ 2018-03-25 23:36  ingy  阅读(1649)  评论(0编辑  收藏  举报