zoukankan      html  css  js  c++  java
  • 1、C++的构造函数

    1、为什么要有构造函数?

    • 构造函数执行必要的初始化工作,有了构造函数,就不必专门再写初始化函数,也不用担心忘记调用初始化函数。
    • 有时对象没被初始化就使用,会导致程序出错。

    2、构造函数的作用

    • 对对象进行初始化,如给成员变量赋初值。只要有对象生成,就一定会有构造函数被调用。

    注意:构造函数并不负责构造一个对象,而是对编译器构造好的对象进行初始化。

    3、构造函数的特点

    • 名字与类名相同,可以有参数,不能有返回值(void也不行)。
    • 如果定义类时没写构造函数,则编译器生成一个默认的无参数 的构造函数。
    • 如果定义了构造函数,则编译器不生成默认的无参数的构造函数。
    • 可以重载。也就是允许有多个构造函数,只要参数列表不同。
    • 最好是public的。 private构造函数不能直接用来初始化对象。

    4、构造函数起作用用的时机

    • 对象生成时构造函数自动被调用。
    • 对象一旦生成,就再也不能在其上执行构造函数。

    5、默认构造函数

    • 默认构造函数又叫无参构造函数。它是指,你编写了一个类,没有显式的为这个类写一个构造函数的话,编译器会自动的帮你写一个构造函数。
    • 一个类中不一定有默认构造函数,只要你自己写了构造函数,就不再有默认构造函数。

    6、构造函数与对象数组、指针数组

    //例1
    class CSample {
    	int x;
    public:
    	//构造函数(1)
    	CSample() {
    		cout << "Constructor 1 Called" << endl;
    	}
    	//构造函数(2)
    	CSample(int n) {
    		x = n;
    		cout << "Constructor 2 Called" << endl;
    	}
    };
    
    int main(){
    	CSample array1[2];          //创建了两个对象,没有传递任何参数
    	cout << "step1"<<endl;
    	CSample array2[2] = {4,5};  //创建了两个对象,向第一个对象传递参数4,向第二个对象传递参数5
    	cout << "step2"<<endl;
    	CSample array3[2] = {3};    //创建了两个对象,向第一个对象传递参数3,没有向第二个对象传递参数
    	cout << "step3"<<endl;
    	CSample * array4 = new CSample[2]; // 在动态内存中创建了一个对象数组,在其中创建了两个对象,使用指针array4指向了这个对象数组
    	delete []array4;
    	return 0;
    }
    
    
    输出:
    Constructor 1 Called
    Constructor 1 Called
    step1
    Constructor 2 Called
    Constructor 2 Called
    step2
    Constructor 2 Called
    Constructor 1 Called
    step3
    Constructor 1 Called
    Constructor 1 Called
    
    //例2:
    class Test {
    public:
    	Test( int n) { } //构造函数(1)  
    	Test( int n, int m) { } //构造函数(2)
    	Test() { } //构造函数(3)
    };
    Test array1[3] = { 1, Test(1,2) };// 构造了3个对象,三个对象分别用(1),(2),(3)初始化
    Test array2[3] = { Test(2,3), Test(1,2) , 1};//构造了3个对象, 三个对象分别用(2),(2),(1)初始化
    Test * pArray[3] = { new Test(4), new Test(1,2) };//创建了3个指针变量,其中前两个指针分别指向了在动态内存中的创建的两个Test对象,并且这两个对象时未命名的
    
    
  • 相关阅读:
    LG P4284 [SHOI2014]概率充电器
    LG P2592 [ZJOI2008]生日聚会
    LG P4953 [USACO02FEB]Cow Cycling
    LG P2389 电脑班的裁员
    LG P2344 [USACO11FEB]Generic Cow Protests G
    前端简历
    前端面试题目
    大前端的技术栈
    前端 -为什么要清楚浮动?
    Redis的功能实现
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764289.html
Copyright © 2011-2022 走看看