当前位置: 首页 > news >正文

青岛胶州网站建设/百度开户渠道

青岛胶州网站建设,百度开户渠道,网上接工程活做的网站,网站开发的评论界面模板一、 auto关键字 1.自动识别数据类型 2.auto的初始化 3.auto简化for循环 nullptr的使用 二、类与对象 1.c中类的定义 2.c语言与c的比较 3.类的访问限定符以及封装 3.1访问限定符 3.2封装 3.3类的作用域 3.4类的声明与定义分离 🗡CSDN主页:d1ff1cult.&…

一、

auto关键字

1.自动识别数据类型

2.auto的初始化

3.auto简化for循环

nullptr的使用

二、类与对象

1.c++中类的定义

2.c语言与c++的比较

3.类的访问限定符以及封装

3.1访问限定符

3.2封装

3.3类的作用域

3.4类的声明与定义分离


🗡CSDN主页:d1ff1cult.🗡

🗡代码云仓库:d1ff1cult.🗡

🗡文章栏目:数据结构专栏🗡

一、

auto关键字

auto的意义:类型名字较长时使用auto来定义比较方便

1.自动识别数据类型

auto关键字可以自动识别数据的类型,我们可以是typeid()name.()函数来查看一个数据的类型

int main()
{int a = 0;int b = a;auto c = a;auto d = &a;auto* e = &a;int& f = a;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;cout << typeid(e).name() << endl;cout << typeid(f).name() << endl;return 0;
}

下面是运行结果

typeid().name()函数可以输出一个数据的类型,我们auto c=a;a是int类型的,那么auto出来的c也是int类型的,auto d=&a,那么这个d的数据类型就是int *。

上面只是auto用法的一个小小小小小的用法。

2.auto的初始化

auto初始化时必须在右边给个值进行初始化,不然auto无法识别数据的类型

auto=x; //对auoto错误的初始化auto x=1.0;
auto x=1.22;

需要注意的是auto不能作为函数的参数,也不能作为一个函数的返回值,与此同时auto也不能用来声明数组

3.auto简化for循环

int main()
{
int array[] = { 1,2,3,4,5 };for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++){array[i] *= 2;}for (int* p = array; p < array + sizeof(array) / sizeof(array[0]); ++p){cout << *p << endl;}for (auto e : array){cout << e << "";}cout << endl;return 0;
}

auto在这里的作用:依次取数组中的数字赋值给e,并且自动判断结束,自动++往后走。

auto简化for循环时 auto e中的e只是数组内容的一份临时拷贝,对e进行操作不会修改数组中的值,如下

int main()
{
for (auto e : array){e++;cout << e << "";}cout << endl;for (auto e : array){cout << e << "";}cout << endl;return 0;
}

如果想要通过修改e来对数组内容进行修改,可以使用 引用

int main()
{
for (auto &e : array){e++;cout << e << "";}cout << endl;for (auto e : array){cout << e << "";}cout << endl;return 0;
}

eg:c语言为了效率,数组是不能够传参的,一般是使用数组的首元素的地址进行传参的。

nullptr的使用

c语言中的NULL本质上是一个宏定义,#define NULL 0

在c++中 为了弥补这一缺陷,使用了nullptr来替换NULL

二、类与对象

1.c++中类的定义

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

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

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

类的两种定义方式:

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

//定义一个人
class People
{
public:void show(){cout << _name << "-" << _sex << "-" << _age << endl;}
public:char* _name; //姓名char* _sex;  //性别int _age;    //年龄
};

2,类声明放在 .h 文件中,成员函数定义放在 .cpp 文件中,注意:成员函数名前需要加类名::    以此来进入对应的域中

People.h//人
class People
{
public:void show();
public:char* _name; //姓名char* _sex;  //性别int _age;    //年龄
};People.cppvoid Person::show()
{cout << _name << "-" << _sex << "-" << _age << endl;
}

2.c语言与c++的比较

c++向下兼容所有c语言struct所有的用法

struct同时升级成了类

1、类名就是类型,Stack就是类型,不需要加struct

2、函数的定义都放在了类中

下面这一段是c语言对栈进行初始化

//C语言
struct Stack
{int* a;int top;int capacity;
};void StackInit(struct Stack* ps);
void StackPush(struct Stack* ps, int x);

 下面是c++的一段

class Stack
{
private:int* a;int top;int capacity;public:void Init(){a = 0;top = 0;capacity = 0;}void Push(int x){//...}bool Empty(){return top == 0;}
};

 同样都是对栈进行声明以及初始化,但其实c++是比较方便简单的,例如Push()函数,c语言是不支持重名函数的,但是在c++中不同的域中函数的作用不同,我们可以通过调用不同的域中的函数来实现不同的功能

3.类的访问限定符以及封装

3.1访问限定符

C++实现封装的方式: 用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

1.public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

3.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

4.如果后面没有访问限定符,作用域就到 },即类结束
5.class的默认访问权限为private,struct为public(因为struct要兼容C)

这里有一道关于struct和class的面试题:

C++ 中 struct 和 class 的区别是什么?

C++ 需要兼容 C语言,所以C++中struct可以当成结构体使用;

另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的 默认访问权限是private;

3.2封装

  • 封装可以隐藏实现细节,使得代码模块化,使代码和功能独立
  • 封装是把函数和数据包围起来,对数据的访问只能通过可信任的对象和类进行访问,对不可信的进行信息隐藏。
  • 封装本质上是一种管理,让用户更方便使用类。

3.3类的作用域

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

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++中花括号定义的都是域

3.4类的声明与定义分离

 类中成员函数可以在类中直接进行声明与定义同时也可以将声明和定义分开,例如下面

在类中定义时,由于我们已经在对应的域中,所以我们不需要使用::访问,若我们将成员函数的声明与定义分离之后,定义的时候就需要加上这样使用:void Stack::Init(),因为我们不知道这个Init函数究竟是哪一个类中的成员,所以我们需要使用::来限制它的域

//Stack.h文件
class Stack
{
private:int* a;int top;int capacity;
public:void Init();void Push(int x);bool Empty();
};
//Stack.cpp文件
void Stack::Init()
{a = 0;top = 0;capacity = 0;
}
void Stack::Push(int x)
{//....
}

在类中定义的函数默认就是inline,正确的定义方法应该是,长的函数的定义和声明分离,短小的可以直接在类里面定义

 3.5成员变量命名规则

class Date
{
public:void Init(int year){year = year;}
private:string year;
};int main()
{return 0;
}

看到这个函数我们不免发出疑问,调用Init的这个函数中 两个year,哪一个是成员变量,哪一个是函数的形参,这样的写法使得阅读代码的人一个头两个大。所以我们可以在成员变量前加上一个下划线来区分形参和成员变量

class Date
{
public:void Init(int year){_year = year;}
private:int _year;
};

 3.6内存对齐规则

1,第一个成员在与结构体偏移量为 0 的地址处。

2,其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

     注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。

     VS中默认的对齐数为8

3,结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍

4,如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体    的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

 3.7类中对象的存储方式

存储方式:保留成员变量,成员函数存放在公共的代码段

 类的大小,根据内存对齐规则可以求得

需要注意的是:一个类的大小就是通过内存对齐规则后求得的大小,特殊的是我们要注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}//private:// 声明int _year;int _month;int _day;
};class A
{
private:char _ch;int _a;
};class B
{};class C
{
public:void f(){};
};
int main()
{Date d1;Date d2;Date d3;cout << sizeof(d1) << endl;cout << sizeof(A) << endl;B b1;B b2;cout << sizeof(B) << endl;cout << sizeof(C) << endl;// 无成员变量的类,对象大小开一个字节,这个字节不存储有效数据// 标识定义的对象存在过return 0;
}

 

类B与类C的大小都是1。

3.8 this指针

我们先来看下面这样一段代码

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;     // 年int _month;    // 月int _day;      // 日
};
int main()
{Date d1, d2;d1.Init(2022, 1, 11);d2.Init(2023, 1, 12);d1.Print();d2.Print();return 0;
}

 

d1.Print()没有传参数,为什么还能打印出d1的内容呢,这一切都要归功于this指针

C++ 编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

 3.9this指针的一些性质

1.this指针的类型是const *类型,不能写this相关的实参和形参,不能给this指针赋值

2.只能在成员函数内部使用

3.this指针能在类中显示调用

4.this指针是个形参,存储在栈帧上,不是存储在对象中的


总结

相关文章:

C++-类与对象(上)

一、 auto关键字 1.自动识别数据类型 2.auto的初始化 3.auto简化for循环 nullptr的使用 二、类与对象 1.c中类的定义 2.c语言与c的比较 3.类的访问限定符以及封装 3.1访问限定符 3.2封装 3.3类的作用域 3.4类的声明与定义分离 &#x1f5e1;CSDN主页&#xff1a;d1ff1cult.&…...

多进程间通信学习之无名管道

无名管道&#xff1a;首先它是内核空间的实现机制&#xff1b;然后只能用于亲缘进程间通信&#xff1b;它在内核所占的大小是64KB&#xff1b;它采用半双工的通信方式&#xff1b;请勿使用lseek函数&#xff1b;读写特点&#xff1a;若读端存在写管道&#xff0c;那么有多少数据…...

flink常用的几种调优手段的优缺点

背景: 不管是基于减少反压还是基于减少端到端的延迟的目的&#xff0c;我们有时候都需要对flink进行调优&#xff0c;本文就整理下几种常见的调优手段以及他们的优缺点 flink调优手段 1.使用事件时间EventTime模式时&#xff0c;可以设置水位线发送的时间间隔&#xff0c;比…...

如何选择安全又可靠的文件数据同步软件?

数据实时同步价值体现在它能够确保数据在多个设备或系统之间实时更新和保持一致。这种技术可以应用于许多领域&#xff0c;如电子商务、社交媒体、金融服务等。在这些领域中&#xff0c;数据实时同步可以带来很多好处&#xff0c;如提高工作效率、减少数据不一致、提高用户体验…...

使用反射调用类的私有内部类的私有方法

文章目录 使用反射调用类的私有方法类实现方法实现代码 使用反射调用类的私有内部类的私有方法类实现方法实现代码 在进行单元测试时&#xff0c;我们往往需要直接访问某个类的内部类或者某个类的私有方法&#xff0c;此时正常的调用就无能为力了&#xff0c;因此我们可以使用反…...

记一次 AWD 比赛中曲折的 Linux 提权

前提背景&#xff1a; 今天一场 AWD 比赛中&#xff0c;遇到一个场景&#xff1a;PHP网站存在SQL注入和文件上传漏洞, MYSQL当前用户为ROOT&#xff0c;文件上传蚁剑连接SHELL是权限很低的用户。我需要想办法进行提权&#xff0c;才能读取到 /root 目录下的 flag。 一、sqlmap …...

[SpringCloud] Feign 与 Gateway 简介

目录 一、Feign 简介 1、RestTemplate 远程调用中存在的问题 2、定义和使用 Feign 客户端 3、Feign 自定义配置 4、Feign 性能优化 5、Feign 最佳实践 6、Feign 使用问题汇总 二、Gateway 网关简介 1、搭建网关服务 2、路由断言工厂 3、路由的过滤器配置 4、全局过…...

[Unity] 个人编码规范与命名准则参考

Unity C# 在写的过程中, 和纯 C# 是有很大出入的. 甚至说, Unity C# 就是邪教. 例如它的命名规范与 C# 是不一致的, 而且由于游戏引擎的介入, 编写时的习惯相较于 C# 来讲, 也需要有所改变. 通用编码规范 常见的一些编码规范就不需要过多提及了, 这里只做简单列举. 添加合适…...

堆栈与队列算法-以链表来实现队列

目录 堆栈与队列算法-以链表来实现队列 C代码 堆栈与队列算法-以链表来实现队列 队列除了能以数组的方式来实现外&#xff0c;也可以用链表来实现。在声明队列的类中&#xff0c;除了和队列相关的方法外&#xff0c;还必须有指向队列前端和队列末尾的指针&#xff0c;即fron…...

快速入门:使用 Spring Boot 构建 Web 应用程序

前言 本文将讨论以下主题&#xff1a; 安装 Java JDK、Gradle 或 Maven 和 Eclipse 或 IntelliJ IDEA创建一个新的 Spring Boot 项目运行 Spring Boot 应用程序编写一个简单的 Web 应用程序打包应用程序以用于生产环境 通过这些主题&#xff0c;您将能够开始使用 Spring Boo…...

01.CentOS7静默安装oracle11g

CentOS7静默安装oracle11g 一、下载Oracle11g安装包二、开始安装oracle11g三、配置Oracle监听程序四、添加数据库实例五、设置开机启动六、登录后解除锁定 一、下载Oracle11g安装包 下载链接&#xff1a;https://pan.baidu.com/s/1gcLMFGX7-8ju7OoFOFLzQA 提取码&#xff1a;6…...

SASE安全访问服务边缘

自存用&#xff1a; 参考文档&#xff1a; 什么是安全访问服务边缘 (SASE)&#xff1f; | Microsoft 安全 网安人必读 &#xff5c;一文读懂SASE - 知乎...

k8s集群升级

目录 1. 部署cri-docker &#xff08;所有集群节点&#xff09; 2. 升级master节点 3. 升级worker节点 4. 部署containerd 1. 部署cri-docker &#xff08;所有集群节点&#xff09; k8s从1.24版本开始移除了dockershim&#xff0c;所以需要安装cri-docker插件才能使用docker …...

redis原理 主从同步和哨兵集群

主从库如何实现数据一致 我们总说的 Redis 具有高可靠性&#xff0c;又是什么意思呢&#xff1f;其实&#xff0c;这里有两层含义&#xff1a;一是数据尽量少丢失&#xff0c;二是服务尽量少中断。AOF 和 RDB 保证了前者&#xff0c;而对于后者&#xff0c;Redis 的做法就是增…...

四季古诗赏析

春晓 春眠不觉晓&#xff0c;处处闻啼鸟。夜来风雨声&#xff0c;花落知多少。 夏意 别院深深夏簟清&#xff0c;石榴开遍透帘明。树阴满地日当午&#xff0c;梦觉流莺时一声。 秋词 自古逢秋悲寂寥&#xff0c;我言秋日胜春朝。晴空一鹤排云上&#xff0c;便引诗情到碧霄。 …...

【网络协议】聊聊套接字socket

网络编程我们知道是通过socket进行编程的&#xff0c;其实socket也是基于TCP和UDP协议进行编程的。但是在socket层面是感知不到下层的&#xff0c;所以在设置参数的时候&#xff0c;其实是端到端协议智商的网络层和传输层。TCP是数据流所以设置为SOCK_STREAM&#xff0c;而UDP是…...

GEO生信数据挖掘(十一)STRING数据库PPI蛋白互作网络 Cytoscape个性化绘图【SCI 指日可待】

GEO生信数据挖掘&#xff08;十&#xff09;肺结核数据-差异分析-WGCNA分析&#xff08;900行代码整理注释更新版本&#xff09; 通过 前面十篇文章的学习&#xff0c;我们应该已经可以获取到一个”心仪的基因列表“了&#xff0c;相较于原始基因数量&#xff0c;这个列表的数…...

api接口更新钉钉文档

class OperateKnowledgeBaseExcel():robot_code # agent_id #app_key #群机器人app_secret #群机器人def __init__(self,union_id, workbook_id, worksheet_id):self.union_id union_idself.workbook_id workbook_id # 获取方式&#xff1a;... &g…...

Android---如何同view进行渲染

ViewRootImpl 在 Activity、window 和 View 三者关系之间起着承上启下的作用。一方面&#xff0c;ViewRootImpl 中通过 Binder 通信机制&#xff0c;远程调用 WindowSession 将 View 添加到 Window 中&#xff1b;另一方面&#xff0c;ViewRootImpl 在添加 View 之前&#xff0…...

【LeetCode:26. 删除有序数组中的重复项 | 双指针】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

如何判断一个对象是不是一个空对象?

在JavaScript中&#xff0c;可以使用以下方法来判断一个对象是否为空对象&#xff1a; 1&#xff1a;使用Object.keys()方法&#xff1a;Object.keys()方法返回一个包含对象自身可枚举属性的数组。通过判断该数组的长度&#xff0c;可以确定对象是否为空对象。 function isEm…...

C/C++ “variable set but not used“的 警告问题解决方案

在编程的过程中&#xff0c;会有一些预留的变量暂时不用&#xff0c;但是编译过程编译器警告 会报错无法编译通过针对这个问题&#xff0c;采用下面的解决方案比较方便。 错误如下形式&#xff1a; 三种解决方法&#xff1a; 1.可以在变量前加上&#xff08;void&#xff09;就…...

JAVA安全入门之反射

反射 对于反射这个概念来说&#xff0c;直白的讲就是&#xff1a; 对象可以通过反射获取他的类&#xff0c;类可以通过反射拿到所有⽅法&#xff08;包括私有&#xff09;&#xff0c;拿到的⽅法可以调⽤而众所周知 JAVA 是一门静态语言&#xff0c;我们通过反射就可以达到动…...

【c++|opencv】一、基础操作---2.图像信息获取

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像信息获取&#xff0c;roi 1. 图像信息获取 // 获取图像信息#include <iostream> #include <opencv2/opencv.hpp>using namespace cv; …...

HarmonyOS开发:探索组件化模式开发

前言 组件化一直是移动端比较流行的开发方式&#xff0c;有着编译运行快&#xff0c;业务逻辑分明&#xff0c;任务划分清晰等优点&#xff0c;针对Android端的组件化&#xff0c;之前有比较系统的总结过相关文章&#xff0c;感兴趣的朋友&#xff0c;可以查看&#xff0c;点击…...

目标URL启用了不安全的HTTP方法

修复中危web项目漏洞&#xff08;目标URL启用了不安全的HTTP方法&#xff09; 漏洞名 &#xff1a;目标URL启用了不安全的HTTP方法 等级&#xff1a; 中危 漏洞位置&#xff1a; PUT DELETE 描述&#xff1a; Web服务器配置为允许使用危险的HTTP方法&#xff0c;如PUT、MOVE、…...

大数据之LibrA数据库系统告警处理(ALM-12001 审计日志转储失败)

告警解释 根据本地历史数据备份策略&#xff0c;集群的审计日志需要转储到第三方服务器上。如果转储服务器满足配置条件&#xff0c;审计日志可以成功转储。审计日志转储失败&#xff0c;系统产生此告警。如果第三方服务器的转储目录磁盘空间不足&#xff0c;或者用户修改了转…...

大模型该被知道的技术实现-面向垂直领域

一个高度清晰的思维导图截图奉上&#xff08;下载&#xff1a;需3积分&#xff09; 内容截图...

赛灵思产品系列

FPGA概述&#xff1a; FPGA的性能主要划分为以下几个方面&#xff1a; 1. 逻辑单元数量&#xff1a;逻辑单元数量越多&#xff0c;FPGA的处理能力越强。 2. 存储单元数量&#xff1a;存储单元数量越多&#xff0c;FPGA的存储能力越强。 3. 时钟频率&#xff1a;时钟频率越高&a…...

[Linux C] signal 的使用

前言&#xff1a; signal 是一种通信机制&#xff0c;可以跨进程发送&#xff0c;可以同进程跨线程发送&#xff0c;可以不同进程向指定线程发送。 信号的创建有两套api&#xff0c;一个是signal&#xff0c;一个是sigaction&#xff0c;signal缺陷很多&#xff0c;比如没有提…...