C++基础语法:类构造函数之普通构造函数

前言

       "打牢基础,万事不愁" .C++的基础语法的学习

引入

        类是实现面向对象思想的主要方法.前面提到:类是函数的变种,类可以通过调用静态方法或者成员函数来实现逻辑.多数情况下使用成员函数.构造函数是生成类对象成员的必须条件,对此做一些构造函数的归纳

构造函数的目的

       接续:做每件事之前都想想目标是什么.学习也是一样,想想设计者的思路是什么. 

        通常情况下类有成员属性和成员函数.构造函数的目的是为了初始化属性(给属性赋初值)

构造函数的形式

        1>直接赋值:最直观的形式,也是用得最多的一种,传入的 形参等于属性值        

        举例: 

class PersonDirect {
	std::string name;
	int age;
public:
	PersonDirect(const std::string& str,int ag):name(str),age(ag){}
};

         调用构造函数生成对象,将名称和年龄传入        

PersonDirect zs_d("张三",40);    //创建一个对象,姓名"张三",年龄40

        2>部分赋值,不给属性赋初值也可以.

        举例:

class PersonDirectSome {
	string name;
	int age;
public:
	PersonDirectSome(const string& str) :name(str) {}    //没有给属性age赋初值
	void setAge(int ag) { age = ag; }                    //设置属性age的值
	int getAge() const { return age; }                   //读取属性age的值
};

        调用构造函数时,传入名称

	PersonDirectSome zs_ds("张三");
	zs_ds.setAge(45);
	cout << zs_ds.getAge() << endl;

         生成对象时age没有初始化,不报错.相当于属性age被"悬挂"起来.唯一注意的是在getAge()之前如果不调用setAge()设置值,则会出现意料之外的结果---相当于随机访问了一块内存地址,地址内值未初始化.

        给属性默认赋值,所有对象的属性用同一个值,比如将上面的构造函数改成

PersonDirectSome(const string& str) :name(str),age(20){} //所有对象age默认为20

        则所有对象的年龄不需要传入,都被默认设成20. 

        3>间接赋值

        构造函数也表达了形参和属性之间的一种"因果"联系.他们不一定是赋值关系.

        举例:构造函数中有表示"姓"的字符串fname,用一个字符lname表示"名"的字符串首字母.

class PersonIndirect {
	string fname;
	char lname;
	int age;
public:
	PersonIndirect(const string& strf, const string& strl ,int ag) :fname(strf), age(ag) {
		lname = strl.at(0);        //获得传入字符串的首字母,交给属性
	}
	char getLname() {              //获得字符
		return lname;
	}
};

        调用构造函数,输入表示"姓"和"名"的字符串,生成对象.

	PersonIndirect zs_i("zhang", "san",44);
	cout << "对象名的首字母是:" << zs_i.getLname() << endl;

默认构造函数

        C++提供了默认构造函数. 举例:

class Default {												//默认构造函数
private:
	int age;
public:
	int getAge() const{ return age; }
};

        调用默认构造函数生成对象,什么都不用输入

	Default df;                    //什么都不用输入,调用默认构造函数生成对象
	cout << df.getAge() << endl;   //警告"使用未初始化内存",因为没有给age赋值

        如果定义了其他构造函数,默认构造函数将失效,上述代码中Default df;将报错

        默认构造函数还是比较有用的,特别在类继承中,派生对象的生成必须先生成基类对象,派生类的构造函数必须要给基类构造函数传入参数.如果给基类定义默认构造函数,则可以简化派生类构造函数.例如:

class Base {									//基类定义
	int age;
public:
	Base(int ag):age(ag){}						//基类普通构造函数
	Base() {									//基类提供默认构造函数							
		age = 20;
	}
	int getAge() const { return age; }
};
class BasePlus : public Base {					//派生类定义
	string name;
public:
	BasePlus(const string& na,int ag):Base(ag),name(na){}	//派生类普通构造函数,参数传给基类构造函数
	BasePlus(const string&na) :name(na) {}//派生类普通构造函数,忽略传给基类参数,使用了基类默认构造函数
};

        调用派生类构造函数,生成派生类对象

	BasePlus lisi("lisi", 30);				//BasePlus普通构造函数,传入年龄30给基类构造函数
	cout << "李四的年龄是:" << lisi.getAge() << endl;;
	BasePlus zs("zs");						//由于基类中定义默认构造函数,简化了派生类对象生成时的编码
	cout << "张三的年龄是:" << zs.getAge() << endl;

         所以一般需要自己定义默认构造函数,即类的构造函数两个以上,含自定义的默认构造函数

        定义方法也比较简单,默认给属性赋值就可以. 

	Base() {							//基类提供默认构造函数							
		age = 20;
	}
============================================================
	BasePlus() {						//派生类默认构造函数
		Base(20);
		name = "nobody";
	}

        还有一种更为简单的方法,给构造函数提供默认参数. 但是试了下如果多个函数使用默认参数的情况似乎不行,所以这是一种选项.        

	Base(int ag=20):age(ag){}			//基类普通构造函数,提供默认参数
	//Base() {							//替换部分							
	//	age = 20;
	//}
========================================================

小结

        有时候觉得C++的语法已经够复杂的了,像构造函数这些相对简单的内容要不要搞得那么复杂.学会后总结一些常规用法,以后就是"复制"和"粘贴".

        小结构造函数的写法:

        1>直接赋值,形参和属性一一对应.这也是用得最多的写法

        2>建议自定义默认构造函数,不写形参,直接给属性赋值.

        3> 默认参数,简化函数调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jllws1

你的鼓励是我创作的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值