C++——类和对象(上)

一、类的基本概念

我们在学习C语言时候学过结构体的知识。结构体里面只能定义成员,而类不仅可以定义成员,还可以定义和声明函数。所以说:

类就是对数据成员,函数声明,函数定义的封装。
其中,数据成员叫做类的属性;函数的定义叫做类的方法;函数声明叫做类方法的声明。这三个都是成员。

二、访问限定符

类在定义成员时,需要对每个成员进行限定。有三个访问限定符。public修饰的成员可以直接在类外进行访问;private/protected在类外不能被直接访问。
类可以用class关键字创建,也可以用struct关键字创建。class创建的类不使用访问限定符修饰时,默认为private;使用struct创建类时不使用访问限定符修饰时,默认为public

三、语法

cpp 复制代码
class 类名{
private:
    类的属性;//属性一般用private修饰,因为C++面向对象的封装要保证数据的安全性,外部无法直接修改
public:
    类方法的声明;//方法一般用public修饰,因为方法是外部需要拿来用的
};
返回值 类名::函数名(参数列表){函数体}//类的方法一般写在外部;定义一般和声明分离,保证项目的工程性

四、类域

类在创建时就定义了新的作用域。方法在外部时需要用::进行访问。

五、类的实例化

(1)概念

类就相当于一个模板,用类创建一个对象就是类的实例化。对象可以使用类中的方法。

(2)语法

cpp 复制代码
类名 对象名;
cpp 复制代码
int main() {
	Data data1;//data1是对象,创建的过程就叫做类的实例化
}

六、对象的大小

对象的大小取决于所属类的属性的大小,遵循内存对齐原则。类只是抽象的模板,不存在内存的概念。
没有属性的类默认其实例化后的对象内存为1。

七、this指针

(1)概念

this指针就是指向当前对象的隐含指针。在你通过方法修改对象的属性时,编译器在编译时自动会添加this指针。

(2)语法

语法:this->属性1

cpp 复制代码
class Data {
private:
	int _year;
	int _month;
	int _day;
public:
	void Init(int year, int month, int day);
};
void Data::Init(int year, int month, int day) {//被调用是this指针指向当前对象的成员数据
	_year = year;
	_month = month;
	_day = day;
}
int main() {
	Data data1;
	data1.Init(2026, 03, 10);//调用初始化函数初始化的是当前对象的成员数据
}

(3)辨析

cpp 复制代码
#include<iostream>
using namespace std;
class A
{
public:
	void Print1()//预处理是这样的:void Print(A* const this)
	{
		cout << "A::Print()" << endl;
	}
	void Print2()
	{
		cout << "A::Print()" << endl;
		cout << _a << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;
	p->Print1();//程序正常运行,这里并不是解引用的意思,解引用是对成员数据,这里是函数
	//意思是A::Print(p),p是this指针,
	//对于Print1虽然传的是空指针,可是我函数内部没有对它进行解引用操作
	p->Print2();//对空指针进行解引用造成程序崩溃,内部用空指针解引用了a
	return 0;
}
相关推荐
caimouse13 分钟前
Reactos 第1章 概述
c语言·开发语言·架构
.千余23 分钟前
【C++】C++继承入门(下):友元、静态成员与菱形继承的底层逻辑
开发语言·c++·笔记·学习·其他
小短腿的代码世界31 分钟前
行情快照与增量更新引擎:Qt在高频交易数据分发中的核心架构——你的行情推送为什么延迟了500ms?
开发语言·qt·架构
初中就开始混世的大魔王36 分钟前
6 Fast DDS-传输层
开发语言·c++·中间件·信息与通信
啊森要自信1 小时前
【GUI自动化测试】控件、鼠标键盘操作与多场景自动化
c语言·开发语言·python·adb·ipython
花北城1 小时前
【C#】ABP框架服务端开发
开发语言·c#·abp
电商API_180079052471 小时前
Python 实现闲鱼商品列表批量采集,接口异常重试机制搭建
大数据·开发语言·数据库·爬虫·python
DogDaoDao1 小时前
深入理解 Qt:从原理到实战的全景指南
开发语言·qt·程序员
放下华子我只抽RuiKe51 小时前
FastAPI 全栈后端(四):认证与授权
开发语言·前端·javascript·python·深度学习·react.js·fastapi
我是唐青枫2 小时前
Java Spring Data JPA 实战指南:Repository 查询、分页与实体映射
java·开发语言