C++构造函数

本文详细解析了C++中构造函数的概念,包括默认构造函数、带参数构造函数及其重载方式,介绍了初始化列表的重要性及使用场景,同时展示了如何正确使用const成员函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Thing

{

public:

Thing( int a=10,int b=20, int c = 30)

//Thing( int a, int b, int c)

{ x=a; y=b; z=c; }

比较两个构造函数头,调用时的区别是什么?

在有参构造函数调用时,如果参数有默认值,则是如下调用的话,Thingt;则系统会自动的调用这个带有三个默认值的构造函数,对象没有参数,一个,两个,三个都会调用此函数。

void printThing()

{cout<<"x="<<x<<"y="<<y<<

"z="<<z<<endl;}//bad practice

private:

intx; int y; int z;

};

int main()

{

Thing t;

t.printThing();

Thing s(1);

s.printThing();

Thing r(1,2);

r.printThing();

Thing v(1,2,3);

v.printThing();

return 0;

}

OUTPUT

x= 10 y= 20 z= 30

x= 1 y= 20 z= 30

x= 1 y= 2z= 30

x= 1 y= 2z= 3

重载构造函数

重载构造函数必须有不同的参数列表,与返回值无关!

class Thing

{

public:

Thing( ) {x =0; y= 0; z=0;} //default constructor

Thing(int a){ x=a;}

Thing(int a, int b) {x=a;y=b;}

Thing(int a, int b, int c)

{x=a;y=b;z=c;}

voidprintThing(){cout<<"x="<<x<<

"y="<<y<<" z="<<z<<endl;}

private:

int x;

int y;

int z;

};

初始化列表

在构造函数头的位置,对类的成员变量进行初始化,叫做初始化列表。

初始化列表的格式为 :成员变量(赋给成员变量的值)

初始化列表优势:1.效率高 2.有一些类型的成员变量,只能用参数化列表的方式初始化,如const、引用

class Point

{

public:

Point() { x =0; y = 0; }

Point(floatx_centre, float y_centre)

{

x=x_centre;

y=y_centre;

}

void printPoint() const { cout << " x=" << x <<

" y=" <<y << endl;}

// const成员函数:成员函数体内,不能修改这个类的成员变量的值

//printPoint里不可以修改x y 的值

private:

floatx;

floaty;

};

class Circle

// A Circle object is a radius and a centre

{

public:

Circle():point(){}; //defaultconstructor

Circle(floatx_centre,float y_centre,float r)

:point(x_centre,y_centre) { radius =r;}

//初始化列表,在Circle的构造函数里,

//调用了Point类的构造函数,并传递相应的参数,给Point的

//成员变量赋值。

//初始化列表的赋值先发生

void setCircle(float r, Point p )//const

{

radius= r;

point = p; //圆心

}

void printCircle() const

//不能通过成员函数修改成员变量的值

//当你不需要在成员函数里修改成员变量的值的时候,建议加上const,可以增加程序的健壮性(鲁棒性)。

{

cout<< "radius:"<<radius;

point.printPoint();

}

private:

floatradius;

Point point;

};

void main()

{

Circle c;//定义一个对象,调用两个构造函数

//当创建复合类的对象时,不仅调用复合类本身的构造函数,

//还将调用复合类的类类型的成员变量的默认构造函数。

c.printCircle();

Point p(5,7);

p.printPoint();

c.setCircle(10,p);

c.printCircle();

Circlec2(33.0,44.0,55.0);

c2.printCircle();

//关于const成员函数增加的代码

constCircle c3( 1, 2, 3 );

//const对象,只能调用const修饰的成员函数,const位于函数小括号

//后面。普通对象,可以调用const成员函数和非const成员函数。

c3.printCircle();

constCircle& c4 = c3;

//const对象,只能赋值给const类型的引用,而不能赋值给普通引用。

c4.printCircle();

//指向常量的指针,即指针指向对象的值不能修改,但可以指向别的对象。

constCircle* c5 = &c2;

c5->printCircle();

//常量指针,c6不能指向别的对象,但是可以修改指向对象的值。

Circle * const c6 =&c1;

Circle* const cp = &c2;//cp只能指向非cosnt对象。

cp->printCircle();

cp->setCircle( 10,p);

//Circle*const p = &c3; //不可以,原因这样有可能会变成可以更改的

const Circle* const pp = &c3;//定义成双cosnt就可以了。

//cp =&c3;

根据const的位置,区分到底哪个是常量——const后面紧跟着的那个就是常量。

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值