C++day3

day3
面向对象基础
1. 类与对象的概念
类:类是对同一类对象的抽象总结,是一个概念。
对象:按照类的规定创建的实体。
程序员就是面向对象编程世界中的“上帝”,因此需要先写类的代码,才能按照这段代码
创建对应的对象。参考类来创建对象的过程被称为“实例化”。因此,对象无法脱离对应的类
存在。
一个类主要包括:
 属性:用来描述对象的数据元素,通常是一个名词变量,例如:身高、体重、价格等,也称
为“成员变量”或“数据成员”。
 行为:用来描述对象执行的具体操作,通常对属性进行操作,以动词函数的方式存在,例
如:吃饭、睡觉、运行等,也称为“成员函数”或“成员方法”。
成员变量和成员函数统称为“成员”。
2. 类的定义
【例子】以手机为例,来说明类的定义。
规定手机的属性:品牌、型号和重量
手机的成员函数:运行游戏、播放音乐、通信
#include <iostream>
using namespace std;
class MobilePhone // 帕斯卡命名法:所有单词的首字母大写
{
public: // 公有权限:最开放的一种权限
 string brand; // 品牌
 string model; // 型号
 int weight; // 重量
 void run_game() // 运行游戏
 {
 cout << "timi" << endl;
 }
 void play_music()
 {
 cout << "只因你太美" << endl;
 }
 void communicate()
 {
 cout << "你好" << endl;
 }
};
int main()
{
 return 0;
}
3. 实例化对象
类是一个抽象的概念,因此需要按照这个概念创建对应的对象实体,C++中有两种类型的
对象:
栈内存对象
在生命周期结束(所在的花括号执行完)后,自动被销毁。
栈内存对象使用 . 调用成员。
堆内存对象
需要使用 new 关键字创建,使用 delete 关键字销毁,如果不销毁,则会持续存在,
容易导致内存泄漏的问题,内存泄漏最终可能会导致程序卡顿,甚至卡死。
堆内存对象通常使用指针来保存堆内存对象的地址。
堆内存对象使用 -> 调用成员,在 Qt Creator 下,直接打.会转换成 ->
#include <iostream>
using namespace std;
class MobilePhone // 帕斯卡命名法:所有单词的首字母大写
{
public: // 公有权限:最开放的一种权限
 string brand; // 品牌
 string model; // 型号
 int weight; // 重量
 void run_game() // 运行游戏
 {
 cout << "timi" << endl;
 }
 void play_music()
 {
 cout << "只因你太美" << endl;
 }
 void communicate()
 {
 cout << "你好" << endl;
 }
};
int main()
{
 // 栈内存对象
 MobilePhone mp1;
 // 调用属性
 mp1.brand = "小米";
 mp1.model = "13 Pro";
 mp1.weight = 216;
 cout << mp1.brand << " " << mp1.model << " "
 << mp1.weight << endl;
 // 调用成员函数
 mp1.communicate();
 mp1.play_music();
 mp1.run_game();
4. 封装
软件测试有黑盒和白盒的概念,MobilePhone 类是一个完全开放的类,所有类的
细节都公开,类似于白盒。
封装作为面向对象的三大特性之一,要求将类的一些属性和细节隐藏,并重新公开给外部
调用的接口,类似于黑盒。
封装的写法并不唯一,在实际的过程中会结合业务需求而定,下面的以一个最基础的案例
进行编写。通常先对属性私有化,使属性隐藏,然后根据当前属性的需求,通过 getter 函数和
setter 函数对类外分别公开读和写的功能。
#include <iostream>
using namespace std;
class MobilePhone
{
private: // 私有权限:只有类内部可访问
 string brand; // 可读可写
 string model; // 只写
 int weight = 188; // 初始值
public: // 公开接口
 string get_brand() // getter:读属性
 {
 return brand;
 }
 void set_brand(string b) // setter:写属性
 {
 brand = b;
 }
 void set_model(string m) // setter
 {
 model = m;
 }
 int get_weight() // getter
 {
 return weight;
 }
};
int main()
{
 MobilePhone mp1;
 mp1.set_brand("小米");
 mp1.set_model("13 Pro");
 cout << mp1.get_brand() << " " << mp1.get_weight() << endl;
封装有利于提升程序的安全性。
5. 构造函数
5.1 概念
构造函数类内一种特殊的函数,用来创建一个对象。如果一个类中,程序员不手动编写构
造函数,编译器会为这个类自动添加一个无参构造函数,且此函数的函数体为空;如果程序员
手写了任意一个构造函数,编译器就不再自动添加构造函数了。
构造函数要求函数名必须与类名完全一致,且构造函数无需写返回值。
#include <iostream>
using namespace std;
class MobilePhone
{
private:
 string brand;
 string model;
 int weight;
public:
// MobilePhone(){} // 编译器自动添加的无参构造函数
 MobilePhone() // 手写构造函数
 {
 // 可以设定属性的默认值
 brand = "山寨";
 model = "8848 钛金手机";
 weight = 188;
 cout << "生产了一部手机" << endl;
 }
 string get_brand()
 {
 return brand;
 }
 void set_brand(string b)
 {
 brand =

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值