【C++第二课 - 类和对象上 - 入门知识】struct类、class类、访问限定符、this指针

面向过程与面向对象初步认识

C语言面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
在这里插入图片描述
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。
在这里插入图片描述

类的定义

struct定义类

C++在C语言的基础上将struct升级成了类
1、struct使用上的升级,不用typedef就可以直接用类名,类名就是类型

struct Stack
{
	int* a;
	int top;
	int capacity;
};

int main()
{
	Stack s1;

	return 0;
}

在这里插入图片描述
2、类里面可以定义函数

struct Stack
{
	int* a;
	int top;
	int capacity;

	void Init()
	{
		a = nullptr;
		top = 0;
		capacity = 0;
	}

	void Push(int x)
	{
		//...
	}
};

int main()
{
	Stack s1;
	s1.Init();
	s1.Push(1);
	s1.Push(2);

	return 0;
}

class定义类

C++更喜欢用class定义类
用class之后会有不同,而这个不同就得因为访问限定符

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

类的访问限定符及封装

访问限定符

在这里插入图片描述
【访问限定符说明】
(1) public修饰的成员在类外可以直接被访问
(2) protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
(3) 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
(4) 如果后面没有访问限定符,作用域就到 } 即类结束。
(5) class的默认访问权限为private,struct为public(因为struct要兼容C)
私有与保护在继承那块有区别,这里可以先认为没有区别
在这里插入图片描述

声明与定义分离

C语言是函数放函数的声明,结构体直接在.h里面
C++类,类的成员放.h里面,类的函数只放声明
变量的声明与定义的区分,要看有没有开空间

Stack.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

class Stack
{
	int* a;
	int top;
	int capacity;

public:
	void Init();
	void Push(int x);
};
test.cpp
#include "Stack.h"

void Stack::Init()
{
	a = 0;
	top = 0;
	capacity = 0;
}

void Stack::Push(int x)
{
	//...
}

int main()
{
	Stack s1;
	s1.Init();
	s1.Push(1);
	s1.Push(2);

	return 0;
}

::这是域作用限定符
在这里插入图片描述
默认是内联,但也不一定会展开,最终展不展开还是看这个函数长不长、编译器的最终决定。
在这里插入图片描述

类规范定义:
长的函数声明与定义分离
短小的函数可以直接在类里面定义

this指针

类成员的命名问题

下列这个问题并不会报错,但d不会被初始化,解决方法:
(1)改变参数的名称(不常用)
(2)改变成员变量的名称(eg:_year,这根据每个公司可能会不一样)

在这里插入图片描述
在这里插入图片描述

this

编译器会处理成下列的样子,不能显示的写
但this指针可以在类里面显示的使用

class Date
{
	int _year;
	int _month;
	int _day;

public:
	void Init(Date* this, int year, int month, int day)
	{
		this -> _year = year;
		this -> _month = month;
		this -> _day = day;
	}
};

int main()
{
	Date d;
	Date d2;
	d.Init(&d, 2024, 1, 21);
	d2.Init(&d2, 2022, 10, 7);
	
	return 0}

this指针存在哪里?
this指针肯定不存在对象里面(因为我们计算对象的时候没有this指针),一般存在于栈帧里面,vs下放在ecx寄存器里
在这里插入图片描述
问题

// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行   C
class A
{
public:
void Print()
{
cout << "Print()" << endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->Print();
return 0;
}

Print不在对象中
在这里插入图片描述

// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行   B
class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->PrintA();
return 0;
}

类的实例化

用类类型创建对象的过程,称为类的实例化

  1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没
    有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个
    类,来描述具体学生信息。
    2.一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
  2. 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设
    计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象
    才能实际存储数据,占用物理空间
    在这里插入图片描述

类的对象大小的计算

类的大小只算成员变量的大小,成员函数不在对象里面。
在这里插入图片描述
在这里插入图片描述

成员函数为何不在对象里面

不同对象的成员函数是一样的
不同对象的成员变量是不一样的

因为成员函数用的都是一样的,如果每个对象都有成员函数,那么就白白浪费空间了。
在这里插入图片描述

类对象大小计算

要考虑内存对齐
内存对齐规定:
对于一个变量:要取其自己的对齐数与默认对齐数小的那个
这个类的大小是8
在这里插入图片描述

class Test2
{};

int main()
{
	Test2 B;
	return 0;
}

B的大小是 : 1,因为要占位。无成员变量的类(可以有成员函数),对象大小开一个字节,这个字节不存储有效数据,标识定义的对象存在过。
【C++第一课 - C++入门】相关软件(vs、gitee)、命名空间、输入输出流、缺省参数、函数重载、引用、内联函数、auto、范围for(语法糖)、nullptr

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值