IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++类与对象(1) -> 正文阅读

[C++知识库]C++类与对象(1)

类的引入

C语言中,结构体只能定义变量,但是C++中结构体内不仅可以定义变量,还可以定义函数。

类的定义

C语言中,我们通常使用struct,而C++中我们引入新的关键字class。

class className
{
 // 类体:由成员函数和成员变量组成
 
}; // 一定要注意后面的分号

具体的例子

class Person
{
public:
 void PrintPersonInfo();
private:
 char _name[20];
 char _gender[3];
 int _age;
};

注意点

我们需要注意的是,类仅仅是一个声名,只有在类创建对象的时候,才会真正的实例化。所以具体的函数,是否内容在类中写出,都可以。
同时也需要避免,在类里直接调用其他类的函数,我们需要明白,声明的含义。

class arr
{
	vector<int> arr;
	arr.push_back(1);//这种做法是错误的,声明中不可以直接调用其他类的函数
};

访问限定符

  1. public修饰的成员在类外可以直接访问
  2. protected和private修饰的成员在类外不能直接被访问
  3. 访问权限符作用域从高该访问限定符出现的位置开始到下一个访问限定符出现时为止
  4. class的默认访问权限为private,而struct的默认访问权限为private

封装

封装本质上是一种管理:我们如何管理兵马俑呢?比如如果什么都不管,兵马俑就被随意破坏了。那么我们首先建了一座房子把兵马俑给封装起来。但是我们目的全封装起来,不让别人看。所以我们开放了售票通道,可以买票突破封装在合理的监管机制下进去参观。类也是一样,我们使用类数据和方法都封装到一下。
不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。

类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域内,在类外定义成员,需要利用::作用域解析符号

class Person
{
public:
 void PrintPersonInfo();
private:
 char _name[20];
 char _gender[3];
 int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
 cout<<_name<<" "_gender<<" "<<_age<<endl; }

类的实例化

类只是模型,告诉我们类里有啥,定义出来的类并没有实际的分配内存空间,只有当类实例化对象以后才能真正意义上的分配空间。

类对象的存储方式

只保存成员变量,成员函数保存在公共代码端
原因非常简单,每个类对象成员变量可能不尽相同,但是成员函数执行一定相同,如果为每个对象单独开辟空间存储成员函数,自然造成了,空间的浪费。

内存对齐

见C语言中内存对齐,原理相同

this指针

class Date
{ 
public :
 void Display ()
 {
 cout <<_year<< "-" <<_month << "-"<< _day <<endl;
 }
 
 void SetDate(int year , int month , int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
private :
 int _year ; // 年
 int _month ; // 月
 int _day ; // 日
};
int main()
{
 Date d1, d2;
 d1.SetDate(2018,5,1);
 d2.SetDate(2018,7,1);
 d1.Display();
 d2.Display();
 return 0; }

我们之前说了,类的成员函数是放在公共代码段的,那么对于d1,d2两个不同的对象调用setDate函数,和Display函数,又是如何区分的呢?
C++通过引入this指针来解决这个问题。C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

this指针的特性

  1. this指针的类型:类类型* const。
  2. 只能在“成员函数”的内部使用。
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
  4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
void Display()
{
	cout<<_year<<endl;//不写this,编译器也会帮你填上
}
void Display(Date* this)
{
	cout<<this->_year<<endl;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 11:41:17  更:2021-08-27 11:43:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:01:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码