03-01构造函数

本文详细介绍了C++中对象的初始化方法,包括构造函数的使用和初始化列表。强调了构造函数在对象创建时自动调用的重要性,并通过示例说明了初始化列表对于常量类型和引用类型数据成员的必要性。同时,提到了类成员初始化的顺序与声明顺序一致,以及拥有默认参数的构造函数并不等同于默认构造函数。最后,通过实例展示了错误地定义多个默认构造函数会导致的编译错误。
摘要由CSDN通过智能技术生成

对象的初始化

  • 不能在声明类时初始化数据成员
  • 对象的初始化方法
    • 调用对外接口public成员函数实现
    • 构造函数实现

构造函数

构造函数是一种特殊的成员函数 它主要用于为对象 分配空间 进行初始化

特点:

  1. 函数名与类名相同
  2. 没有返回类型(有隐含的返回值,系统内部使用)
  3. 不能被显式调用
  4. 函数体可以写在类体内或类体外
  5. 可以重载
  6. 不能继承
  7. 一般声明为公有函数

两种方式:

  1. 构造函数体内赋值语句
class Date{
public:
	Date(int y, int m, int d) {
		year = y;
		month = m;
		day = d;
	}
private:
	int year, month, day;
};
  1. 构造函数的初始化列表
class Date{
public:
	Date(int y, int m, int d): year(y), month(m), day(d) { };
private:
	int year, month, day;
};

构造函数的调用

在声明类时如果没有定义类的构造函数,编译系统就会在编译时自动生成一个默认形式的构造函数,默认构造函数是构造对象时不提供参数的构造函数。
除了无参数构造函数是默认构造函数外,带有全部默认参数值的构造函数也是默认构造函数。
(注意这两者情况不能同时算为默认构造函数;当同时出现时,一般是没有参数的那个算)
一个类只能有一个默认构造函数
自动调用:构造函数在定义类对象时自动调用,不需用户调用,也不能被用户调用。在对象使用前调用。
调用顺序:在对象进入其作用域时对象使用前调用构造函数。

初始化列表的注意点

对于常量类型和引用类型的数据成员不能在构造函数中用赋值语句直接赋值的情况,提供初始化表进行赋初值。

#include<iostream>
using namespace std;
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& rx;
	const float pi;
};
int main()
{
	A a(10);
	a.print();
	return	0;
}

如果需要将数据成员存放在堆中或数组中,则应在构造函数中使用赋值语句(即使构造函数有成员初始化表)。

class C
{
public:
	C(int I, char Ch, float F, char N[]) : i(I), ch(Ch), f(F)
	{
		strcpy(name, N);
	}
private:
	int	i;
	char ch;
	float f;
	char name[25];
};

类成员是按照它们在类里被声明的顺序初始化的,与它们在初始化表中列出的顺序无关

class D{
private:
	int mem1;
	int mem2;
public:
	D(int i): mem2(i), mem1(mem2 + 1)
	{
		cout << "mem1:" << mem1 << endl;
		cout << "mem2:" << mem2 << endl;
	}
};
int main()
{
	D d(15);
	return 0;
}
/*
输出结果:
mem1:-858993459
mem2:15
*/

问题

#include<iostream>
using namespace std;
class X {
public:
	X();
	X(int x = 0) :x(x) {};
private:
	int x;
};
void main()
{
	X a(10);
	X b;		// ERROR,包含多个默认构造函数
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值