当前位置: 首页 > news >正文

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> 默认参数,简化函数调用

http://www.lryc.cn/news/384968.html

相关文章:

  • Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单
  • 提高Java应用稳定性的部署实践
  • 简过网:考公务员报班和不报班的区别大吗?
  • 文化财经盘立方通达信期货通支撑压力自动画线多空转折指标公式源码
  • 重生之我要学后端11--数据库基础概念(持续更新)
  • 配置 Cmder 到鼠标右键
  • kali下安装使用蚁剑(AntSword)
  • GIT-LFS使用
  • 免费分享一套SpringBoot+Vue在线水果(销售)商城管理系统【论文+源码+SQL脚本】,帅呆了~~
  • 推荐两款电脑文件处理工具,强大到你不舍得卸载
  • Python 高级实战:基于自然语言处理的情感分析系统
  • ruby面试题
  • Android U Settings 应用中 APN 菜单实现的代码逻辑
  • java时间处理工具类
  • Android高级面试_2_IPC相关
  • docker封禁对外端口映射
  • 【leetcode系列】567.字符串的排列(滑动窗口)
  • 情感分析方法与实践
  • 迁移学习——CycleGAN
  • 【软件测试】对于测试中的bug,我们真正了解了吗?
  • Packer-Fuzzer一款好用的前端高效安全扫描工具
  • 解决卸载TabX explorer软件后导致系统文件资源管理器无法正常使用问题
  • qt for android 使用打包sqlite数据库文件方法
  • MYBATIS大于等于、小于等于的写法
  • 基于堆叠长短期记忆网络 Stacked LSTM 预测A股股票价格走势
  • SpringCloud Alibaba Sentinel基础入门与安装
  • Arduino IDE下载、安装和配置
  • SOBEL图像边缘检测器的设计
  • Day35:2734. 执行字串操作后的字典序最小字符串
  • 【高考志愿】机械工程