C++复习

注:本文章所写内容是小编复习所看的。记录的是一些之前模糊不清的知识点。详细c++内容请移步至小编主页寻找。

竞赛小技巧

竞赛中cin/cout用不了(没有办法刷新缓冲区,导致cin/cout与缓冲区绑定)

解决办法:(加以下三行代码)

//或则 换scanf/printf

ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

类和对象上

namespace命名空间域

不同的域可以定义相同的变量

c++中的域:函数局部域,全局域,命名空间域,类域

::域作用限定符:默认查找全局变量

cout/endl/cin定义在<iostream> iostream 在命名空间域std中

缺省参数

全缺省:每个变量都缺省

半缺省:一部分变量缺省,一部分不缺省(缺省顺序从右向左连续缺省,不能间隔不能跳跃,

传参时从左到右)

缺省函数定义和声明分离时是不能同时出现的(规定)

eg:

stack.h
void Sinit(St*st,int n=100);//生明给
stack.cpp
void Sinit(St*st,int n=200);//不允许
stack.cpp
void Sinit(St*st,int n);//允许

函数重载

要求:同一命名域名(不同命名域名空间域可以有相同函数)

同名函数(不同参数类型或则不同参数个数或不同参数顺序<int,char>//<char,int>)

注:返回值不同不是函数重载

引用

引用的特性

1.引用必须初始化

int& ra;//不清楚是取得谁的别名

2.一个变量可以有多个引用(可以引用引用对象)

3.引用一旦引用一个实体,再不能引用其他实体

引用的使用

注意:做返回值

eg:修改栈顶元素

int SStop(ST& rs){//获取栈顶元素
return rs.a[rs.top-1];
}
SStop=3;//修改不允许  因为返回值返回时会生成一个临时变量(具有常性)不能修改//如果使用引用作返回值(不会产生临时变量直接把数组top位置返回),则可以避免类似情况发生
int& SStop(ST& rs);

const引用

引用const对象必须要用const引用

//错误示范(权限被放大)
/*const int a = 20;
int& ra = a;*/const int a = 10;
const int& ra = a;//正常权限int b = 30;
const int& rb = b;//权限缩小const int& ra=30//常量用const引用const int& rb=(a+b);//(a+b)为临时变狼具有常性 正常权限用const 引用//注:一些计算表达式结过,或则变量类型转换都会产生一个临时变量(临时变量具有常性)

引用和指针的区别

1.引用是给变量取别名(本身不开空间),指针式取变量的地址(指针本身就要开空间)

2.引用必须初始化,指针可以不初始化 。

3.引用只能引用一个对象,指针可以指向多个对象

4.引用直接访问变量,指针需要解引用

5.sizeof(引用变量),sizeof(指针,指针变量 32-4 64-8)

6.引用没有空指针形式,引用可能出现野指针

内联函数(inlline)

适用于频繁调用短小函数

作用:替代宏(#define add(a,b) ((a)+(b))

对于宏替换的目的就是不在建立函数(减少函数栈帧),从而使空间不在浪费。

对于inline函数就是在函数前面添加关键字inline(debug版本下不在在乎性能便于调试默认不展开)

inline int add(){
}

debug版本下调试的方法:(更改项目属性c/c++ 常规为程序数据库,优化改 内敛只适用于inline)

注1:inline函数只是一个建议,对于编译器来讲合理的地方加inline可以展开,不合理的地方加inline编译器也不会展开。

注2:inline函数不建议做声明和变量分离(inline无地址)

nullptr

c语言中NULL的存在是宏替换的存在,define NULL 0

在c++中函数重载时如何传NULL则会出现歧义。

nullptr可以转化成任意类型的指针但不能转化成整形。

类和对象(上)

class{_成员变量成员函数}

class未加访问限定符默认为private,struct默认为public

对于公有和私有简单理解(实例化对象时是否能访问到对应的函数)

对于类成员函数声明和定义分离要指定类域

类域

不同类域可以定义相同名称.

类的实例化

对于类里边的成员变量只是声明(声明是该变量时什么类型,并未开空间)。

对象大小计算

对于类对象大小计算方法:只计算成员变量的大小(每个对象有各自得的成员变量),不计成员函数的大小(成员函数默认放在一个地方,对象调用时调用同一个成员函数)

如果类中没有成员变量那么类对象的大小为1

为什么要内存对齐

cpu读取数据时并不是从任意地方开始读取的,cpu一次性读取指定整数倍位置(如果不对齐则可能数据读取不对)

this指针

this指针实际是做为一个参数(所以this指针存放在栈中)

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class A {
public:void Print() {cout << this << endl;cout << "A.Print()" << endl;}int _a;
};
int main() {A* p = nullptr;p->Print();//p->正常来讲是解引用,但是Print函数并不是在p类中所以该地方并不是解引用,所以不会报错,Print(&p)传nulptr并不是报错p->_a=1;//_a是成员变量需要对指针进行解引用,又因为p是空指针,所以会报错。 return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class A {
public:void Print() {cout << this << endl;cout << "A.Print()" << endl;cout<<_a<<endl//通过this指针访问——athis->a但是this指针为空所以会报错。}private:int _a;
};
int main() {A* p = nullptr;p->Print();//p->正常来讲是解引用,但是Print函数并不是在p类中所以该地方并不是解引用,所以不会报错,Print(&p)传nulptr并不是报错p->_a=1;//_a是成员变量需要对指针进行解引用,又因为p是空指针,所以会报错。 return 0;
}

类和对象中

默认成员函数

构造函数

1.函数名与类名相同,不需要返回值(void也不用),功能:初始化对象)

2.对象实例化时系统会自动调用相应的构造函数。

3.构造函数(有参数构造和无参数构造 构成构造函数函数重载)。

注意:全缺省和无参不能同时存在

4.什么叫默认构造函数?

无参的,全缺省的,我们不写系统默认生成的构造函数成为默认构造函数(在一个类中三者仅且仅能出现一个)。

c++类型分配

a.内置类型(基本类型)int/double

b.用户自定义类型 class/struct 修饰的类型

不写,编译器自动生成的的对内置类型的初始化不确定,对自定义类型如果没有对应的默认构造不进行初始化则会报错。

析构函数(函数销毁)

功能:完成类对像中的资源清理释放

无参数(不能重载),无返回值,与构造函数相反,前边加~

析构顺序:后定义的先析构

拷贝构造函数

规定:拷贝构造函数的第一个参数是对自身类类型的引用,其他任何额外的参数都有默认值,符合以上条件的函数叫拷贝构造函数。

拷贝构造函数的特点:

1.拷贝构造函数是构造函数的一个重载。

2.拷贝构造函数的第一个参数是对自身类类型的引用,如果采用传值传参这则会引发无穷递归。

c++规定:

函数的传值传参需要先调用拷贝构造函数。

贝构造对内置类型完成值拷贝/浅拷贝(一个字节一个字节拷贝),对于自定义类型会调用他的拷贝构造函数。

注意:像日期类这样没有开任何资源空间的类是可以不用自己写拷贝构造函数,但是像栈/队列有开辟新空间的类如果要像完成拷贝必须自己写·。

如下:如果我们不自己写,编译器默认生成的拷贝构造函数,会对栈完成值拷贝/浅拷贝,这样的话拷贝后两块资源同时指向同一个位置,那么析构函数的时候就会释放该空间两次,程序就会崩溃。

解决方法:

重新开一个相同大小的空间,memcpy进行拷贝即可

传值返回与传引用返回

传值返回会产生一个临时对象的拷贝,传引用返回不用产生临时拷贝,但是传引用返回(返回值是全局或则出来出了函数还能找到,如果返回的是函数局部域中的变量,那么 传引用返回时函数栈帧已经销毁,返回的引用就成为野引用)。

赋值重载函数

运算符重载

载,若没有运算符重载则编译会报错。

2.参数个数与运算对象时一一对应的

3.格式:operator + (运算符 )

4.调用方式:a.显示调用 operator+=(Date d1,Date d2);//x1==x2

建议:重载函数放在类里边,第一个参数传给this指针

调用方法:x1.operator==(x2) //x1==x2 x1给this,x2=传一个参数

5.不能重载的运算符:.* :: . sizeof ?:

6.重载运算符至少有一个类类型的参数operator+(int x,int y)//毫无意义 operator+ (Date& d1,int x)//ok

赋值运算符重载

赋值运算符重载是指对已经存在的两个对象进行拷贝赋值

拷贝构造是指一个已经初始化的对象去拷贝另一个没有存在的对象

一元运算符重载
d1++,++d1区分

后置++增加一个int形参

d1++:operator++(int);

++d1: operator();

取地址运算符的重载
const成员函数

const去修饰成员函数把const放在成员函数后边。

简单理解:

实例化对象时如果对象为 const Date d3(2004,4,11);

对象被const修饰,假如去调用类中Print函数,传参第一个为Date* this,(由const Date* d3->Date* this 显然求安县被放大)为了防止权限被放大我们要在该函数后边+const void Print() const{}

取地址运算符的重载
Date* operator&(){
return this; //this就是实例化对象地址
return nullptr; //可以保护自己程序地址
}
const Date* operator&()const {
return this;
}

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Date {
public:Date* operator&() {//return nullptr;return (Date*)0x211;}const Date* operator&() const{return nullptr;}
};
int main() {Date d1;cout <<&d1<< endl;return 0;
}

类和对象下

1.再探构造函数

初始化列表(初始化变量的地方)

引:在初始化列表不管显示写成员变量还是不写 成员变量都会走初始化列表。

1.简单理解:类似于构造函数对变量进行初始化,但是,初始化列表对变量进行初始化时并不是在函数体内进行的,而是在构造函数外边进行初始化,初始化格式以:(冒号)开始,,(逗号)分割的形式,而且每个初始化变量的后边都要加一个括号。

eg:
Date (int year,int mouth,int day)
:_year(year)
,_mouth(mouth)
,_day(day)
{}

 

2.c++规定:a. 初始化列表是类中每个成员变量定义的地方

3.只能在初始化列表进行初始化不能再函数体内进行初始化的类型

a.由const修饰的成员变量只能在初始化列表进行初始化

b.引用类型的成员变量必须在初始化列表进行初始化

c.对于自定义类型如果该自定义变量有对应的默认构造(原本类里边),那么可以不在初始化列表对它进行初始化,如果没有该变量的默认构造,则需要在初始化列表进行初始化,若存在默认构造且在初始化列表对该变量也有进行初始化,则优先使用初始化列表的初始化。

3.初始化列表的缺省值

初始化列表的初始值是在,成员变量定义的地方进行赋值(虽然该法地方进行赋值,但是地方仍然是变量声明的地方并没有开空间)

总结:

 

2.类型转换

对于类型转换,一个类型转换成另一个类型,其实就是把该类型转换成一个临时变量,再把临时变量复制给转换类型。

如果不想类型转换在构造函数前面加关键字explicit

3.static静态成员

特性:

1.静态成员变量必须在类外面进行初始化。

2.静态成员变量不属于类对象(存放在静态区),不存在类对象中,但被所有类所共享。

3.静态成员函数:我们无法正常访问静态成员变量,因为他是私有保护,要i选哪个访问静态成员变量只有用静态成员函数。

静态成员函数没有this指针,只能访问静态成员变量,不能访问其他成员变量。非静态访问静态随便访问。

static int GetCount(){
return count;
}
//调用方法
cout<<A::GetCount<<endl;

4.友元函数

作用:突破类域的访问限定符

1.要想访问私有成员变量则只需在该函数头部加friend 放在类中(只是一种声明,并不是成员函数)

2.友元类:: friend class B 为了访问私有成员变量。

3.友元类特性:单向的,不能交换,不能传递

注意:友元破坏了c++封装特性,不建议多用。

5.内部类

定义:一个类定义在另一个类的里边

1.内部类跟定义的全局类类似,只不过受类类域的限制,并不包含于外部类(计算大小时并不计算内部类)。

2.默认内部类是是外部类的友元(可以直接访问外部类的成员变量)。

6.匿名对象

方便理解:匿名对象就为了我们方便。

注:1.生命周期只在当前这一行。

A aa;//有名对象
A();
A(1);//匿名对象

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】多线程

目录 多线程基础什么是线程线程和进程的关系线程的特点什么是多线程编程为什么要使用多线程线程与CPU的执行关系线程的生命周期 创建线程&#xff08;C11&#xff09;线程的可调用对象传参数 注意事项join和detach的区别一个线程包含什么东西this_thread 线程同步线程同步机制互…

《深度剖析算法优化:提升效率与精度的秘诀》

想象一下&#xff0c;你面前有一堆杂乱无章的数据&#xff0c;你需要从中找到特定的信息&#xff0c;或者按照一定的规则对这些数据进行排序。又或者&#xff0c;你要为一个物流公司规划最佳的配送路线&#xff0c;以降低成本和提高效率。这些问题看似复杂&#xff0c;但都可以…

怎么实现Redis的高可用?

大家好&#xff0c;我是锋哥。今天分享关于【怎么实现Redis的高可用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 怎么实现Redis的高可用&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 为了实现 Redis 的高可用性&#xff0c;我们需要保证在发…

【CSS】HTML页面定位CSS - position 属性 relative 、absolute、fixed 、sticky

目录 relative 相对定位 absolute 绝对定位 fixed 固定定位 sticky 粘性定位 position&#xff1a;relative 、absolute、fixed 、sticky &#xff08;四选一&#xff09; top&#xff1a;距离上面的像素 bottom&#xff1a;距离底部的像素 left&#xff1a;距离左边的像素…

使用docker-compose安装Redis的主从+哨兵模式

必看 本文是一主二从一哨兵模式&#xff1b;其余的单机/集群/多哨兵模式的话&#xff0c;不在本文... 本文的环境主要是&#xff1a;应用app在本地&#xff0c;redis在云服务器上&#xff1b; 图解 图如下&#xff1a;这个图很重要&#xff1b; 之所以要这样画图&#xff0…

深度剖析RabbitMQ:从基础组件到管理页面详解

文章目录 一、简介二、Overview2.1 Overview->Totals2.2 Overview->Nodesbroker的属性2.3 Overview->Churn statistics2.4 Overview->Ports and contexts2.5 Overview->Export definitions2.6 Overview->Import definitions 三、Connections连接的属性 四、C…

[0405].第05节:搭建Redis主从架构

Redis学习大纲 一、3主3从的集群配置&#xff1a; 1.1.集群规划 1.分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff1a; 2.每组是一主一从&#x…

QT在 MacOS X上,如何检测点击程序坞中的Dock图标

最近在开发MacOS的qt应用&#xff0c;在做到最小化系统托盘功能时&#xff0c;发现关闭窗口后再次点击程序坞中的Dock图标不能将主界面再显示出来。查询里很多资料&#xff0c;发现是QT自身的问题&#xff0c;没有做相关的点击Dock图标的处理。 于是我参考了国内和国外的这两篇…

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色&#xff0c;我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的&#xff0c;这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…

每日学习30分轻松掌握CursorAI:Cursor插件系统与扩展功能

Cursor插件系统与扩展功能 一、课程概述 今天我们将学习Cursor AI的插件系统&#xff0c;了解如何通过插件扩展和增强IDE功能。由于Cursor AI基于VS Code开发&#xff0c;我们可以利用丰富的VS Code插件生态系统。 1.1 学习目标 了解插件系统原理掌握插件安装管理使用常用开…

第G1周:生成对抗网络(GAN)入门

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 本人往期文章可查阅&#xff1a; 深度学习总结 基础任务 1.了解什么是生成对抗网络2.生成对抗网络结构是怎么样的3.学习本文代码&am…

浅谈云计算03 | 云计算的技术支撑(云使能技术)

云计算的技术支撑 一、定义与内涵1.1 定义与内涵 二、云计算使能技术架构2.1 宽带网络和 Internet 架构2.2 数据中心技术2.3 虚拟化技术2.4 Web 技术2.5 多租户技术2.6 服务技术 一、定义与内涵 1.1 定义与内涵 云计算技术包含一些基础的关键技术&#xff0c;这里称为使能技术…

Open FPV VTX开源之betaflight配置

Open FPV VTX开源之betaflight配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充 - 飞控固件版本 1. 源由 飞控嵌入式OSD - ardupilot配置使用betaflight配套OSD图片。 Choose correct font depending on Flight Controller SW. ──> /usr/share/fonts/├──> font_btfl…

【数字化】华为-用变革的方法确保规划落地

导读&#xff1a;华为在数字化转型过程中&#xff0c;深刻认识到变革的必要性&#xff0c;并采用了一系列有效的方法确保转型规划的有效落地。华为认为&#xff0c;数字化转型不仅仅是技术层面的革新&#xff0c;更是企业运作模式、流程、组织、文化等深层次的变革。数字化转型…

Vue2+OpenLayers给标点Feature添加信息窗体(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 3.1、信息窗体DOM元素 3.2、创建Overlay 3.3、创建一个点 3.4、给点初始化点击事件 3.5、完整代码 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 初始化变量&#xff1a; d…

CRMEB多商户商城系统JAVA版 B2B2C商家入驻平台系统独立版全开源

系统框架 基于Java vueuni-app开发&#xff0c;并采用业界主流开发框架SpringBoot; 前端开发中&#xff0c;Web PC管理端使用vue element山&#xff0c;移动端使用uni-app框架&#xff0c;前后端分离开发;

【Linux】进程状态

一、概念 我们需要知道进程的不同状态。一个进程可以有几个状态&#xff08;在Linux内核里&#xff0c;进程有时候也叫做任务&#xff09; 在操作系统原理中&#xff1a;运行状态分为以下三种&#xff1a;运行状态&#xff08;执行&#xff09;、阻塞状态、就绪状态 1. 运行状…

UE材质节点Fresnel

Fresnel节点 ExponentIn 控制边缘透明度 BaseReflectFractionIn 控制中心透明度

LeetCode100之搜索二维矩阵(46)--Java

1.问题描述 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回…

“AI 自动化效能评估系统:开启企业高效发展新征程

在当今数字化飞速发展的时代&#xff0c;企业面临着日益激烈的市场竞争&#xff0c;如何提升效率、降低成本成为了企业生存与发展的关键。AI 自动化效能评估系统应运而生&#xff0c;它如同一把智能钥匙&#xff0c;为企业开启了高效发展的新征程。 AI 自动化效能评估系统&…