已知
- 创建类时,数据成员不能初始化,只能在构造函数中进行初始化
- 实例化时,分为两种。一种是指针,一种是非指针类型
类名 对象名;
类名 对象名(实参);
类名 *对象名;
对象名=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,℞
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