c++构造函数,空构造函数实例化时出错

已知

  • 创建类时,数据成员不能初始化,只能在构造函数中进行初始化
  • 实例化时,分为两种。一种是指针,一种是非指针类型
类名 对象名;
类名 对象名(实参);
类名 *对象名;
对象名=new 类名([参数]);//参数根据构造函数判断

构造函数

  • 作用:创建对象的成员函数,为对象申请空间。并且对数据成员进行赋值
  • 当没有定义构造函数时,系统会自动提供一个缺省的构造函数,(即:没有参数和函数体)
  • 形式:函数名和类名相同,可以有参数,但是没有返回值
1、在类内定义
public 类名([参数])//参数是可选项
{
	函数体
}
2、在类外定义
类名 :: 类名([参数])
{
	函数体
}
  • 注意,这点非常重要
           当我们没有定义构造函数时,系统会自动调用一个无参无函数体的构造函数。但是如果定义了一个构造函数,无论是什么样的,系统的构造函数便不再被使用。
           也就是说,当我们定义了一个带参数的构造函数,但是没有定义无参的构造函数,在生成对象时,如果想使用无参构造函数进行实例化,便会报错。只能使用我们定义过的构造函数实例化。因此,在一个类中,保险起见,构造函数至少定义两个,包含一个无参数的。
  • 初始化列表
    1、形式:
class Date{
    int day,month,year;
	Date (int d,int m,int y):day(d),month(m),year(y)
	{}
};

        2、使用场景:
              数据成员是常量
              数据成员是引用了类型
              数据成员是没有无参构造函数的类的对象
原因就是成员变量在类的定义时不能初始化。

         3、例子:

#include <iostream>
using namespace std;
class A{
public:
	A(int i):x(i),rx(x),pi(3.14)
	{}
	void display()
	{cout<<"x="<<x<<"rx="<<rx<<"pi="<<pi<<endl;}
private:
	int x,&rx;
	const float pi;
};


int main(){
	A aa(10);
	aa.display();
	return 0;
}

class B
{ public :
    B( int x, int y ) : aa( x ),  b( y ) { }//aa(x):相当于A的构造函数实参
    void out()
      { cout << "aa = " << aa.a << endl << "b = " << b << endl ; }
  private :
      int b ;
      A aa ;
} ;

    4、注意:初始化列表赋值时,按照数据成员的声明顺序,依据初始化列表进行赋值,不是构造函数时的顺序。
比如说如下代码:解释在代码后面的说明

#include <iostream>
using namespace std;
class CMyClass{
public:
	CMyClass(int x, int y):m_y(x),m_x(m_y)//注意:给m_x赋值的是m_y,不是y
	{
		cout<<"m_x="<<m_x<<endl;
		cout<<"m_y="<<m_y<<endl;
	}
private:
	int m_x,m_y;
};
int main()
{
	CMyClass mc(15,10);
	return 0;
}

注意:给m_x赋值的是m_y,不是y
注意:给m_x赋值的是m_y,不是y
注意:给m_x赋值的是m_y,不是y

说明:先给m_x赋值,但是m_x的值是m_y,但是m_y还没有赋值,因此系统随机赋值。然后给m_y赋值为x
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值