[C++]关键字,类与对象等——喵喵要吃C嘎嘎2

news2024/11/25 23:52:29

0a4bde25e142427e9fb8f47ab1aca386.png

希望你开心,希望你健康,希望你幸福,希望你点赞!

最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要!

目录

前言

auto关键字(C++11)

基于范围的for循环(C++11)

指针空值nullptr(C++11)

面向过程和面向对象认识

类的引入

类的定义

类的两种定义方式:

类的访问限定符

封装

类的作用域

总结


前言

今天我们总结关键字,喵喵队,冲冲冲!!!

今天也是想你的一天,喵呜~


auto关键字(C++11)

C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

注意:使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

auto的使用注意:

  • auto与指针和引用结合起来使用

       用auto声明指针类型时,用autoauto*没有任何区别,但用auto声明引用类型时则必           须加

	int main()
	{
	int x = 10;
	auto a = &x;
	auto* b = &x;
	auto& c = x; 7
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl; 11
	*a = 20;
	*b = 30;
    c = 40;

	return 0;
	}

  • 在同一行定义多个变量

        当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为          编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

	void TestAuto()
	{
	auto a = 1, b = 2;
	auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
	}
  • auto不能作为函数的参数
  • auto不能直接用来声明数组
  • 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法

基于范围的for循环(C++11)

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号 分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围

void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 }; for(auto& e : array)
e *= 2;
for(auto e : array)
cout << e << " ";

return 0;
}

注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。

范围for的使用

for循环迭代的范围必须是确定的

对于数组而言,就是数组中第一个元素和最后一个元素的范围

对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。

注意:以下代码就有问题,因为for的范围不确定

	void TestFor(int array[])
	{
	for(auto& e : array)
	cout<< e <<endl;
	}

指针空值nullptr(C++11)

声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。

NULL实际是一个宏。

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)。

注意:

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptrC++11作为新关键字引入的
  2. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr
  3. C++11中,sizeof(nullptr)  与  sizeof((void*)0)所占的字节数相同。

面向过程和面向对象认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。


类的引入

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数。

typedef int DataType;
struct Stack
{
void Init(size_t capacity)
{
_array = (DataType*)malloc(sizeof(DataType) * capacity); if (nullptr == _array)
{
perror("malloc申请空间失败"); return;
}
_capacity = capacity;
_size = 0;
}
void Push(const DataType& data)
{
// 扩容
_array[_size] = data;
++_size;
}

DataType Top()
{
return _array[_size - 1];
}

void Destroy()
{
if (_array)
{
free(_array);
_array = nullptr;
_capacity = 0;
_size = 0;
}
}

DataType* _array;
size_t _capacity;
size_t _size;
};

int main()
{
Stack s;
s.Init(10);
s.Push(1);
s.Push(2);
s.Push(3);
cout << s.Top() << endl;
s.Destroy();
return 0;
}

C语言结构体的定义,可以改成class,去试试吧!


类的定义

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

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。

类体中内容称为类的成员:类中的变量称为类的属性成员变量;  类中的函数称为类的方法或者成员函数

类的两种定义方式:
  1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

  1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
  2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名

喵喵建议:更期望采用第二种方式。

注意:上课为了方便演示使用方式一定义类,大家后序工作中尽量使用第二种。

// 我们看看这个函数,是不是很僵硬?
class Date
{
public:
void Init(int year)
{
// 这里的year到底是成员变量,还是函数形参?
year = year;
}
private:
int year;
};

// 所以一般都建议这样
class Date
{
public:
void Init(int year)
{
_year = year;
}
private:
int _year;
};

// 或者这样
class Date
{
public:
void Init(int year)
{
mYear = year;
}
private:
int mYear;
};


类的访问限定符

【访问限定符说明】

  1. public修饰的成员在类外可以直接被访问
  2. class的默认访问权限为private,struct为public(因为struct要兼容C)
  3. 如果后面没有访问限定符,作用域就到 } 即类结束。
  4. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  5. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

【面试题】

问题:C++structclass的区别是什么?

解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和  class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是 private。注意:在继承和模板参数列表位置,struct和class也有区别。


封装

面向对象的三大特性:封装、继承、多态

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

封装本质上是一种管理,让用户更方便使用类

比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的 等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可

在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用


类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域

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

总结

今天就到这里吧!喵喵会努力更新的,麻烦佬佬多多支持。


希望你开心,希望你健康,希望你幸福,希望你点赞!

最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要!

530b9a7e0a634b81bfe44228d5ff8023.png

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

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

相关文章

小米手机刷EU版ROM教程

第一件事 拿到手机第一件事是登录账号&#xff0c;然后开启开发者模式&#xff0c;设置中搜索&#xff1a;手机解锁状态 绑定解锁账号&#xff0c;等168小时候才能解锁 提前下载软件包 官方解锁工具 官方Fastboot工具 recovery包&#xff1a;twrp ROM包 其他: EU rom论坛页…

Proteus仿真--数码管随机模拟显示乘法口诀(仿真文件+程序)

本文主要介绍基于51单片机的数码管随机模拟显示乘法口诀实验&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中上方主要是6位显示数码管&#xff0c;使用方法点击左下方的按键开关实现不同的数字切换&#xff0c;按照乘法表进行 仿真运行视频 Prote…

Python入门教程——Python变量定义的简单使用介绍

文章目录 前言一、变量的定义二、变量的简单使用三、类型转换关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前…

接口测试用例设计详解

1.接口测试用例设计简介 我们对系统的需求分析完成之后&#xff0c;即可设计对应的接口测试用例&#xff0c;然后用接口测试用例进行接口测试。接口测试用例的设计也需要用到黑盒测试方法&#xff0c;其与功能测试用例设计的方法类似&#xff0c;接口测试用例设计中还需要增加…

MATLAB和S7-1200PLC OPC通信(激活S7-1200PLC OPCUA服务器)

MATLAB和SMART PLC OPC通信请参考下面文章博客: MATLAB和西门子SMART PLC OPC通信-CSDN博客文章浏览阅读123次。西门子S7-200SMART PLC OPC软件的下载和使用,请查看下面文章Smart 200PLC PC Access SMART OPC通信_基于pc access smart的opc通信_RXXW_Dor的博客-CSDN博客OPC是…

软考网络规划师复习第六章:基础网络实验

正文共&#xff1a;10086 字 120 图&#xff0c;预估阅读时间&#xff1a;11 分钟 目录 软考网络规划师复习第一章&#xff1a;Windows系统中的网络 0、序言 1、Windows系统中的网络1.1、桌面中的网卡1.2、命令行中的网卡1.3、路由表1.4、家用路由器 软考网络规划师复习第二章&…

Python词云生成工具3:定制更多参数

文章目录 添加整型参数布尔型参数背景颜色词云生成逻辑源代码 Python打造一个词云软件显示分词结果 添加整型参数 我们所有的设置都放在了wcDct中&#xff0c;所以若想用更多的参数来定制词云&#xff0c;那么只需在wcDct中添加内容&#xff0c;例如下面这些整型参数 其次&a…

【Linux】进程概念III --fork函数解析

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本篇导航 0. 创建进程1. 认识fork函数2.使用Fork函数3.关于fork的为什么3.1 一个函数如何返回两次?fork究竟在干什么?3.2 为什么要给子…

0-1矩阵列互斥问题——回溯法 Python实现

三、 0-1 矩阵的列集互斥问题。给定一个 m n m \times n mn 的 0-1 矩阵 A \mathrm{A} A 。定义列互斥为: 对于矩阵 A A A 中的任意两列 i i i 和 j j j, 如果在对应的每一行上, i i i 和 j j j 不存在同时为 1 的情况, 则称列 i \mathrm{i} i 和 j \mathrm{j} j 互斥…

Redis-命令操作Redis->redis简介,redis的安装(Linux版本windows版本),redis的命令

redis简介redis的安装&#xff08;Linux版本&windows版本&#xff09;redis的命令 1.redis简介 Redis是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存存储的数据结构服务器&#xff0c;可用作数据库&#xff0c;高速缓存和消息队列代理。 它支持字符串、哈…

零基础入门Python,主要该学些什么?一文详解。

文章目录 前言一、Python开发基础二、Python高级编程和数据库开发三、前端开发四、WEB框架开发五、爬虫开发六、全栈项目实战七、数据分析八、人工智能九、自动化运维&开发十、高并发语言GO开发关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精…

Nginx的location优先级和重定向

Nginx的location有优先级级和匹配方式&#xff1a; 在http模块有server,在server模块才有location,location匹配的是uri /test /image 在一个server当中有多个location,如何来确定匹配哪个location。 Nginx的正则表达式&#xff1a; ^:字符串的起始位置 $:字符串的结束位…

推荐彩虹知识商城源码

彩虹知识商城7.0.3小森升级版新增供货商开心学习版&#xff0c;新增邮件提醒功能&#xff0c;支持给用户发订单、结算等邮件通知&#xff0c;支持给管理员发送提现、域名审核等邮件通知&#xff0c;支持设置手续费最低扣除金额&#xff0c;修复了其他一些已知问题。 演示地址&…

工作数字化的中国历程 | 从 OA 到 BPM 到数字流程自动化

业务流程是由“活动”&#xff08;或称“工作任务”&#xff09;构成的&#xff0c;在企业里的所有工作是不是都叫流程&#xff0c;或者属于流程的一部分&#xff0c;这个概念很绕&#xff0c;我觉得没有必要去做学究气的辨析。我曾经提出过一个从工作的两个特性&#xff08;产…

x86保护模式笔记

多任务 调用门权级规则 合法调用门g1定义: 门g1.DPL 贱于或等于 门g1.目标段.DPL若 代码段p1.CPL 优于或等于 门g1.DPL 则 p1 正常 call g1TSS 权级规则 权级规则4. p代码段CPL d数据段DPL: 判定p访问d 若 p代码段CPL < d数据段DPL, 则p能访问d …

听听ChatGPT对IT行业的发展和就业前景的看法

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:PYTHON学习系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 目录 (1)判断素数 写法1: 写法2: (2)计算1-100的偶数之和 写法1: 写法2: (3)计算1-100的奇数之和 (4)多层循环 IT行业哪个方向比较…

腾讯云双十一云服务器活动:88元1年的云服务器难道不香吗?

腾讯云双十一活动中&#xff0c;有三款轻量应用服务器可享受特惠优惠。这三款服务器分别是2核2G、2核4G和4核8G&#xff0c;价格分别为88元/年、166.6元/年和529元/15个月。对于需要低成本而又高性能的服务器需求&#xff0c;轻量应用服务器是一个理想的选择。 轻量应用服务器特…

Linux常用命令——chattr命令

在线Linux命令查询工具 chattr 用来改变文件属性 补充说明 chattr命令用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性&#xff0c;这些属性共有以下8种模式&#xff1a; 语法 chattr(选项)选项 a&#xff1a;让文件或目录仅供附加用途&#xff…

某某盾-滑块验证-自动获取validate值-(逆向js+python)

我是标题 1.从get&#xff1f;网站获取滑块图片以及token1.1获取fp值1.2 获取cb值1.3 模拟发包 2.获取滑块移动距离3.发包获取最终的validate值3.1轨迹生成3.2 check网站发包3.3 获取data值 4.结论 本实验是根据某某盾示例网站 主要分为两个部分 1.从get&#xff1f;网站获取滑…

TypeScript 第一站概念篇

前言 &#x1f52e; 好长一段时间没有写文章了&#xff0c;原因是经历了一次工作变动&#xff0c;加入了一个有一定规模的开发团队&#xff0c;前端算上我有四个人&#xff0c;很欣慰&#xff0c;体验一下团队配合的感觉&#xff0c;在我之上有一个组长&#xff0c;比我年长四…