C++入门篇(4)—— 类与对象(1)

news2024/11/18 20:31:17

目录

1.类的引入

2.类的定义

3.类的访问限定符

4.类的作用域

5. 类对象的存储方式

6. this指针

6.1 this指针的引入

6.2 this指针的特性

6.3有意思的面试题


1.类的引入

C语言struct 结构体中只能定义变量,而C++中可以定义函数。

struct Date
{
	void Init(int year = 2023, int month = 12, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	int _year;
	int _month;
	int _day;
};

就像这样一个日期结构体,可以在内部定义函数,这就是一个类。在C++中,更喜欢用class来定义类。

2.类的定义

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

这 就是类的定义方式。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。

类中的函数有两种定义方式

1.直接在类中定义函数,但需要注意,这样编译器可能将该函数视为内联函数。

2.类中函数声明,在类外定义函数。在类外定义函数需要注意成员函数名前加上类名。

struct Date
{
	void Init(int year = 2023, int month = 12, int day = 1);
	int _year;
	int _month;
	int _day;
};

//注意成员函数名前加上类名
void Date::Init(int year = 2023, int month = 12, int day = 1)
{
	_year = year;
	_month = month;
	_day = day;
}

3.类的访问限定符

访问限定符会对访问类进行的操作进行限制,有三个访问限定符:public(公有)、private(私有)、protected(保护)

具体用法如下

class Date
{
public:
	void Init(int year = 2023, int month = 12, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:	
    int _year;
	int _month;
	int _day;
};

这样外部只能访问Init这个成员函数而不能访问到类中的三个成员变量。 目前可以认为private和protected区别不大。

需要注意的是,class默认访问权限是private,而struct默认访问权限是public(为了兼容C),

访问限定符的作用范围是到下一个访问限定符或 } 为止。

访问限定符的出现是为了更好的管理,C语言中的结构体访问过于宽松自由以至于可能会造成一些意想不到的bug。而C++中的类可以限制对类对象的访问,这样更加安全。

4.类的作用域

类会有一个新的作用域,在外部定义类成员时,需要指定类名。

5. 类对象的存储方式

类对象中成员变量是存储在类对象中的,而会多次被调用的成员函数,并不会存储在类对象中,否则定义多个类对象会造成较大的空间浪费,因为每个类对象中都存储有同一个函数地址,这显然是不合理的,会造成很大的浪费。

class Date
{
public:
	void Init(int year = 2023, int month = 12, int day = 1);
private:	
	int _year;
	int _month;
	int _day;
};
void Date::Init(int year, int month, int day)
{
	_year = year;
	_month = month;
	_day = day;
}
int main()
{
	Date d;
	d.Init();
	cout << sizeof(d) << endl;
	return 0;
}

运行这段代码会发现结果是12,这说明成员函数并不存在类对象中。

成员函数被存放在公共的代码段。

这里注意一下,类的大小计算方式和结构体对齐规则相同,并且空类大小为1,不是0。

6. this指针

6.1 this指针的引入

class Date
{
public:
	void Init(int year = 2023, int month = 12, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:	
    int _year;
	int _month;
	int _day;
};

先看这个类,我们在调用成员函数时是这样调用的

int main()
{
	Date d1;
	d1.Init();
	Date d2;
	d2.Init();
	return 0;
}

我们传参时并没有传入给哪个对象调用这个函数的信息。举个例子来理解一下。

C语言中要实现Date 类中的这个Init函数功能,一定会是这样的一个函数

void Init(struct Date* pd, int year, int month, int day);

总之一定会把对哪个对象调用函数的有关信息给写入形参列表,这个信息可能是那个对象的地址,

这样才能确定对哪个对象调用函数。

而C++中的成员函数都存放在公共的代码段,其中并没有任何关于对象的信息,如何确定对哪个对象操作呢?

实际上,C++在这里跟C语言的处理手法是一样的,同样传入了一个地址,用一个指针变量来接收,这样函数就能知道对哪个对象进行操作了。

6.2 this指针的特性

this指针类型:类类型* const ,对Date类来说,this指针类型就是Date* const,这意味着,this指针的值,是不能修改的。

this指针只能在成员函数内部使用。

this指针本质是成员函数的形参,是成员函数的一部分,是不会存在对象内部的。

this是由编译器自动传递的,不需要用户自己手动传递。

6.3有意思的面试题

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


int main()
{
    A* p = nullptr;
    p->Print();
    return 0;
}

相信一般都会认为会运行崩溃吧,但是实际结果既出人意料又在情理之中。结果是A。

根据上面对this指针的讲解,我们可以理解其实这里的p只是会传给Print作为形参,而Print函数中没有对p作解引用操作,因此自然不会崩溃,而是正常运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1443099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XSS-Lab

1.关于20关的payload合集。 <script>alert(1)</script> "><script>alert(1)</script> onclickalert(1) " onclick"alert(1) "><a href"javascript:alert(1)"> "><a HrEf"javascript:alert…

古典密码(5)

一、Porta密码--替换密码 1.介绍&#xff1a;Porta密码(Porta Cipher)是一个由意大利那不勒斯的医生Giovanni Battista della Porta发明的多表代换密码&#xff0c;Porta密码加密解密过程的是相同的。Vigenere 密码是具有 26 个字母的多字母密码&#xff0c;而 Porta 除了仅使…

Linux应用程序几种参数传递方式

大家好&#xff0c;今天给大家介绍Linux应用程序几种参数传递方式&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在Linux中&#xff0c;应用程序可以通过多种方式接收参数。以下…

JavaScript综合练习4

JavaScript 综合练习 4 1. 案例演示 2. 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

从源码学习访问控制符使用

从源码学习访问控制符使用 Java中的访问控制符 ​ 在Java中&#xff0c;有四个访问控制符&#xff1a;public、protected、default&#xff08;默认或缺省&#xff0c;不使用关键字&#xff09;和private。 ​ 它们的访问范围如下&#xff1a; public&#xff1a;公共访问权…

【数据分享】1901~2022中国1km逐月潜在蒸散发数据集

大家新年好啊&#xff01;今天给大伙儿分享的是1901~2022中国1km逐月潜在蒸散发数据集&#xff0c;收藏一下&#xff0c;过完年再看&#xff01;当然了&#xff0c;如果有问题的朋友&#xff0c;可以添加俺微信交流。 1 数据简介 数据集为中国逐月潜在蒸散发&#xff0c;空间分…

Redis核心技术与实战【学习笔记】 - 24.Redis 脑裂

简述 所谓脑裂&#xff0c;就是指在主从集群中&#xff0c;同时有两个主节点&#xff0c;它们都能接收写请求。而脑裂最直接的影响就是客户端不知道该往哪个主节点写入数据&#xff0c;结果就是不同的客户端会往不同的主机诶点上写入数据。而且&#xff0c;严重的话&#xff0…

尝新果未熟,探新途未尽。寒冬凝锐气,雷鸣蓄神力——小康师兄的2023年度总结

文章目录 一、前言二、工作总结2.1 我期望的&#xff0c;而公司想要的2.2 公司利益VS员工利益2.3 这个问题问得很有问题 三、生活总结3.1 一胎3.2 二胎 四、其他总结4.1 博客4.2 无人自助台球馆4.3 我要出书了 五、OKR 一、前言 又是一年除夕夜&#xff0c;万家灯火同团圆。 老…

15.3 Redis入门(❤❤❤❤)

15.3 Redis入门❤❤❤❤ 1. redis简介与配置1.1 简介1.2 Windows安装1.3 Linux安装1.4 守护进程方式启动1.5 客户端启动与使用1.6 指定生成日志 2. 使用2.1 客户端redis使用命令2.2 redis存储的数据类型1. String字符串类型2. Hash键值类型3. List列表类型4. Set与Zset集合类型…

力扣刷题之旅:进阶篇(四)—— 滑动窗口问题

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 引言&#xff1a; 在编程的世界里&#xff0c;滑动窗口问题是一种…

python 自我检测题--part 1

1. Which way among them is used to create an event loop ? Window.mainloop() 2. Suppose we have a set a {10,9,8,7}, and we execute a.remove(14) what will happen ? Key error is raised. The remove() method removes the specified element from the set. Th…

Python算法题集_两两交换链表中的节点

Python算法题集_两两交换链表中的节点 题24&#xff1a;两两交换链表中的节点1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【四节点法】2) 改进版一【列表操作】3) 改进版二【三指针法】4) 改进版三【递归大法】 4. 最优算法 本文为Python算法…

幻兽帕鲁服务器怎么更新?进入游戏显示:加入的比赛正在运行不兼容的版本,请尝试升级游戏版本(阿里云)

幻兽帕鲁服务器怎么更新&#xff1f;进入游戏显示&#xff1a;加入的比赛正在运行不兼容的版本&#xff0c;请尝试升级游戏版本。这是因为游戏客户端或者服务器上的游戏服务端&#xff0c;没有更新版本。导致两个版本不一致&#xff0c;所以无法进入游戏。 最近幻兽帕鲁 官方客…

Git 消除对某个文件的追踪

参考&#xff1a; &#xff08;尚未验证他的该方法&#xff09; https://www.golinuxcloud.com/git-remove-file-from-tracking/https://www.golinuxcloud.com/git-remove-file-from-tracking/

第9讲 详解第 2 套真题

第9讲 详解第 2 套真题 基本编程题【15 分】简单应用题【25 分】综合应用题【20 分】问题 1【10 分】:问题 2【10 分】:各位小伙伴想要博客相关资料的话关注公众号:chuanyeTry即可领取相关资料! 基本编程题【15 分】 考生文件夹下存在一个文件 PY101.py,请写代码替换横线,不…

蓝桥杯官网练习题(翻转)

问题描述 小蓝用黑白棋的 n 个棋子排成了一行&#xff0c;他在脑海里想象出了一个长度为 n 的 01 串 T&#xff0c;他发现如果把黑棋当做 1&#xff0c;白棋当做 0&#xff0c;这一行棋子也是一个长度为 n 的 01 串 S。 小蓝决定&#xff0c;如果在 S 中发现一个棋子…

AB测试最小样本量

1.AB实验过程 常见的AB实验过程&#xff0c;分流-->实验-->数据分析-->决策&#xff1a;分流&#xff1a;用户被随机均匀的分为不同的组实验&#xff1a;同一组内的用户在实验期间使用相同的策略&#xff0c;不同组的用户使用相同或不同的策略。数据收集&#xff1a;…

【技巧】PCB布局技巧:带条纹的电容

这些都是无极性电容&#xff0c;所以这个条纹不是极性标记。一位读者得回答正确&#xff0c;它代表电容卷绕时&#xff0c;卷绕在外层的那一极。我发现现在很少有工程师知道电容一端的条纹代表什么&#xff0c;也不知道条纹端和不带条纹端互换带来的不同效果。即使你从来不使用…

fast.ai 深度学习笔记(二)

深度学习 2&#xff1a;第 1 部分第 4 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-1-lesson-4-2048a26d58aa 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这…

Adaptec RAID 控制器arcconf 管理命令的常见的查询操作

ARCCONF命令行工具可以在服务器正常运行过程中对Adaptec RAID卡进行带内在线查询配置操作&#xff0c;无需重启服务器&#xff0c;十分方便快捷&#xff0c;本文讲解常见的查询操作。 一、查询流程 二、常见指令 1、查询已安装的RAID卡清单 [rootlocalhost ~]# ./arcconf-lin…