一、对象的使用
- 对象是一个实体,在使用对象时,它的每一个数据成员都应有确定的值。
一般形式 :
类名 对象1,对象2,.- 对象中成员的访问通过对象名和对象选择符访问对象中的成员
一般形式是:
对象名.数据成员 或 对象名.成员函数名[(实参表)]
其中"."叫做对象选择符,简称点运算符
class Point{
public:
void setpoint(int a,int b)
{
x=a;
y=b;
}
int getX(){
return x;
}
int getY(){
return y;
}
private:
int x,y;
};
int main()
{
Point op1,op2;//对象的定义
int i,j;
op1.setpoint(2,3);//函数的调用
op2.setpoint(4,5);
i=op1.getX();
j=op1.getY();
cout<<"op1 i="<<i<<" op1 j="<<j<<endl;
i=op2.getX();
j=op2.getY();
cout<<"op2 i="<<i<<" op2 j="<<j<<endl;
}
//使用new运算法动态建立对象的方式
**Complex* pa=new Complex(1.1,2.2);
cout<<"复数的绝对值是:"<<pa->abscomplex()<<endl;**
使用new运算符动态建立对象的方式,开辟了一段内存空间,存放了一个Complex类对象,同时调用了该类的构造函数给数据成员赋初值。这个对象没有名字,称为无名函数(感觉好像跟java的匿名对象差不多),当该对象有地址,这个地址存放在指针变量pa中,访问通过指针访问。
二、构造函数的使用
- 构造函数
class Person
{
public:
Person(); //声明1个无参数的构造函数
Person(string x,int y,int z); //声明1个带有三个参数的构造函数
void showPerson();
private:
string name;
int num;
int height;
};
Person::Person(){ //定义1个无参数的构造函数
name="康师傅没有眼泪";
num=82080888;
height=75;
}
Person::Person(string x,int y,int z){//定义1个带有三个参数的构造函数
name=x;
num=y;
height=z;
}
inline void Person::showPerson(){
cout<<name<<","<<num<<","<<height<<endl;
}
int main()
{
Person per1; //定义类Person的对象per1,调用无参的构造函数
cout<<"Person1 output:"<<endl;
per1.showPerson();
Person per2("卧龙先生",82080888,1000); // 定义类Person的对象per3并初始化
cout<<"Person2 output:"<<endl;
per2.showPerson();
> 说明:
> 在使用构造函数时,如果用户没有定义构造函数,系统就会自动提供一个函数体为空的默认构造函数,但是,只要类中定义了一个构造函数(不一定是无参构造函数),系统将不再给它提供默认的构造函数。
2.带有初始化列表的构造函数
class A
{
public:
A(int x1):x(x1),rx(x),pi(3.14) { }带有初始化列表的构造函数
void print()
{
cout<<"x="<<x<<" "<<"rx="<<rx<<" "<<"pi="<<pi<<endl;
}
private:
int x;
int ℞
const double pi;
};
int main()
{
A a(20);
a.print();
return 0;
}
成员初始化列表写法方便,尤其当需要初始化的数据成员较多时更能显示其优越性,带有成员初始化列表的构造函数的一般形式如下:
类名:构造函数名([参数表])[:(成员初始化列表)]
{ //构造体 }
总结:
-
c++允许构造函数重载,以适应不同的场合,这些构造函数之间以它们之间所带参数个数和类型的不同而区分。
-
尽管一个类中可以包含对个构造函数,但对每一个具体的对象而言,建立对象时只执行其中的一个构造函数。
-
如果构造函数在类的声明外定义,那么默认参数上应该在类内声明构造函数原型时指定,而不能在类外构造函数定义时指定,因为类的声明是放在头文件中的,用户可以看到,而构造函数的定义是类的实现细节,用户往往是看不到的。因此,在声明时指定默认参数,可以保证用户在建立对象时知道怎样使用默认参数。
-
如果构造函数的全部参数都指定了默认值,则在定义对象时可以指定一个或几个实参,也可以不给出实参,这时的构造函数也属于默认构造函数。
Person(double x=0.0,double y=0.0);
因为一类中只能声明一个默认构造函数,因此不能再声明无参数的构造函数 Person();
-
在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数
Person(double x=0.0,double y=0.0)
person(double p);
因此,一般不要同时使用构造函数的重载和有默认参数的构造函数。