快速复习一遍C++基础知识点

2023-10-27

暂定月计划:1实现DSA基础算法 2完成一个STL库 3在Linux上加强相关知识 4git巩固 5OJ增强代码实现能力
今天先快读复习一遍C++知识点,(想把peral读完==)


1 引用

  1. 交换两个数示例:
    C语言中:
void swap(int *a, int* b)
{
	int tmp;
	tmp = *a; *a = *b; *b = tmp;
}
int n1, n2;
sawp(&n1, &n2);//n1,n2的值被交换

C++中用引用

void sapw(int &a, int &b)
{
	int tmp;
	tmp = a; a = b; b=tmp;
}
int n1, n2;
sapw(n1, n2);
  1. 引用作为函数的返回值
int n = 4;
int& SetValue() {return n;}
int main()
{
	SetValue() = 40;
	cout<<n;
	return 0;
}
  1. 常引用
    定义引用时,前面加const关键字,即为常引用;不能通过常引用去修改其引用的内容;但并不是说它引用的内容就不能被修改,是可以通过其他方式被修改的 (跟常量指针一个道理,不能通过常量指针修改内容)
int n = 100;
const int & r = n;//常引用
r = 200;//编译错
n = 200;//没问题
  1. const T &T&
    T &类型的引用或者T类型的变量可以用来初始化const T &类型的引用,反之不可以,除非用强制类型转换;同理,不能把常量指针赋值给非常量指针,而反之可以,除非强制类型转换;
    常常会在函数内将函数参数定义为常量指针,就可以避免函数内部不小心改变参数指针所指地方的内容

2 动态内存分配

new运算符实现动态内存分配,(在C中用malloc分配)
方法1:

P = new T;

T是任意类型名,P是类型为T*的指针;动态分配出一片大小为sizeof(T)字节的内存空间,并且将该内存空间的起始地址赋值给P

int *pn; pn = new int; *pn = 5;

方法2:

P = new T[N];

分配出N* sizeof(T)的内存空间,并将该内存的起始地址赋值给P

delete运算符进行释放,必须指向new出来的空间,注意一个空间不能被delete多次,举例delete释放动态分配的数组:

int *p = new int[20];
p[0] = 1;
delete[] p;//删除new出来的一个数组一定要加一个[]

3 内联函数、函数重载、函数缺省参数

  1. 内联函数
    函数调用是有时间开销的,如果函数本身只有几条语句,执行非常快,那么当这样简单的函数被反复执行很多次的时候,相比之下调用函数函数所产生的开销反而显得比较大。
    (在调用一个函数时,首先要把参数、返回地址放入到栈中,当函数执行完需要从栈里取出返回地址,再跳转到返回地址去执行,这些都是额外的开销)
    为了减少函数调用的开销,引入了内联函数机制。编译器处理对内联函数的调用时,是将整个函数的代码插入到调用语句处,就不会产生调用函数的语句。 在函数前加inline关键字;

  2. 函数重载
    一个或多个函数,名字相同,然而参数个数或者参数类型不相同,为函数重载;函数重载使得函数命名变得简单了。编译器根据调用语句中的实参的个数和类型判断应该调用哪个函数

  3. 函数的缺省参数
    C++中,定义函数的时候可以让最右边的连续若干个参数有缺省值,那么调用函数的时候,若相应位置不写参数,参数就是缺省值

void func(int x1, int x2 = 2, int x3 = 3){}
func(10);//等效于func(10,2,3)
func(10,,8);//不行,只能最右边的连续若干个参数缺省

函数重载目的是为了提高程序的可扩充性
即如果某个写好的函数要添加新的参数,而原先那些调用函数的语句,未必需要使用新增的参数,那么为了避免对原先那些函数调用语句的修改,就可以使用缺省参数√

构造函数

成员函数的一种,名字与类名相同,可以有参数,不能有返回值(void也不行);作用是对对象进行初始化,如对成员变量赋初值;但注意对象所占用的存储空间并不是构造函数分配的,构造函数只是在对象已经占了内存空间后做一些初始化的工作
类一定有构造函数,如果定义类时没有写构造函数,则编译器生成一个默认的无参数的构造函数,不做任何的操作;一个类可以有多个构造函数(函数重载);但一旦有了自己定义的构造函数,编译器便不产生无参数的默认构造函数了,如果有需要无参的,就需要自己写了;
对象生成时构造函数会被自动调用,但注意对象一旦生成,就再也不会再在其上执行构造函数了

复制构造函数

只有一个参数,即对同类对象的引用
如:X::X(X&)X::X(const X&),二者选一,参数必须是引用不能是对象,后者能以常量对象作为参数;更多情况下会用第二种形式,因为一般情况下都不会去修改实参的值
如果没有定义复制构造函数,那么编译器会生成默认的拷贝构造函数

复制构造函数起作用的三种情况:

  1. 当用一个对象去吃书画同类的另一个对象时
Complex c2(c1);
Complex c2 = c1;//这是初始化语句,不是赋值语句
  1. 如果某函数有一个参数是类A的对象,那么该函数被调用时,类A的复制构造函数将被调用
  2. 如果函数的返回值是类A的对象时,则函数返回时,A的复制构造函数被调用

类型转换构造函数

1定义转换构造函数的目的是实现类型的自动转换;
2 只有一个参数,而且不是拷贝构造函数的构造函数,一般就可以看做是转换构造函数;
3当需要的时候,编译系统会自动调用转换构造函数,建立一个无名的临时对象(或临时变量)(编译器对临时对象操作)

析构函数

  1. 加~;没有参数和返回值,一个类最多只能有一个析构函数
    析构函数对象消亡时即自动被调用,可以定义析构函数来在对象消亡前做如释放分配空间的工作;
    如果定义类时没写析构函数,则编译器生成缺省析构函数,缺省析构函数什么也不做
  2. 在数组中,对象数组生命期结束时,对象数组的每个元素的析构函数都会被调用
    举例:
class Ctest
{
public:
	~Ctest(){cout<<"析构调用"<<endl;}
};
int main()
{
Ctest array[2];
cout<<"结束mian"<<endl;
return 0;
}
/*
输出结果:
结束main
析构调用
析构调用
*/
  1. 关于析构函数和运算符delete
    delete运算符导致析构函数调用
Ctest *pTest;
pTest = new Ctest;//构造函数被调用
delete pTest;//析构函数被调用
//
pTest = new Ctest[3];//构造函数调用3次
delete [] pTest;//析构函数调用3次

若new一个对象数组,在delete时不用[],那么只调用一次析构函数,delete一个对象

静态成员变量

普通成员变量每个对象有各自一份,而静态成员变量一共就一份,被所有对象共享;普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象;静态成员不需要通过对象就能访问
sizeof运算符不会计算静态成员变量
静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在;同理,静态成员函数本质上也是全局函数;
注意:必须在定义类的文件中对静态成员变量进行一次声明or初始化,否则编译能通过,链接不能通过
在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数

常量成员函数

class Sample
{
public:
	int value;
	void GetValue() const;//常量成员函数
	void func(){};
	Sample()}{};
};
void Sample::GetValue() const
{
value = 0;//wrong
func();//wrong 常量成员函数上不能执行非常量成员函数
}

运算符重载

本质是函数重载;
等号运算符重载示例:

String & operator = (const String & s)
{
	if(this == &s)
		return *this;
	delete [] str;
	str = new char[strlen(s.str)+1];
	strcpy(str, s.str);
	return *this;
}

继承关系、复合关系

虚函数和多态

在类定义中,前面有virtual关键字的成员函数是虚函数;注意嗷,virtual关键字只用在类定义里的函数声明中,写函数体是不用写;构造函数和静态成员函数不能是虚函数

class base
{
	virtual int get();
};
int base::get(){};

虚函数可以多态,普通函数不可以

多态的表现形式:

  1. 派生类的指针可以赋给基类指针
  2. 通过基类指针调用基类和派生类中的同名虚函数时:若该指针指向一个基类的对象,那么被调用时基类的虚函数;若该指针指向一个派生类的对象,那么被调用的是派生类的虚函数
  3. 多态的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的是基类的还是派生类的函数,运行时才确定,这叫动态联编
  4. 在派生类中和积累中虚函数同名同参数表的函数,不加virtual也自动成为虚函数
  5. 每一个有虚函数的类(或有虚函数的类的派生类)都有一个虚函数表,该类的任何对象中都放着虚函数表的指针。虚函数表中列出了该类的虚函数地址。每个对象会多出来的4个字节就是用来放虚函数表的地址的
  6. 堕胎的函数调用语句被编译成一系列根据基类指针所指向的(或基类引用所指向的)对象中存放的虚函数表的地址,在虚函数表中查找虚函数地址,并调用虚函数的指令

输入输出和模板

输入输出流,文件读写(略略略)

函数模板和类模板

在有多个函数和函数模板名字相同的情况下,编译器处理一条函数调用语句的顺序:
1)先找参数完全匹配的普通函数(不是由模板实例化而得的函数)
2)再找参数完全匹配的模板函数
3)再找实参经过自动类型转换后能够匹配的普通函数
4)上面的都找不到,则报错

编译器由类模板生成类的过程叫类模板的实例化,由类模板实例化得到的类叫模板类
同一个类模板的两个模板类是不兼容的

模板标准库STL

  1. string类
    string类时模板类typedef basic_string<char> string
    使用string类要包含头文件
    初始化举例:
string s1("Hello");
string month = "March";
string s2(8,'x');//8个x

可以用“=”赋值,assign复制,compare比较,substr子串,sawp交换,find寻找,rfind倒找,erase删除,replace替换,insert插入,c_str转换成char*字符串

vector、deque、list
set、map、multiset、multimap
stack、queue、priority_queue

函数对象

若一个类重载了运算符“()”,则该类的对象就成为函数对象
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速复习一遍C++基础知识点 的相关文章

随机推荐

  • 一种基于Harris-Laplace算法的角点检测方法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 Harris Laplace 检测方法原理 2 运行结果 3 Matlab代码实现 4 参考文献
  • 深度学习目标检测方法汇总

    目标检测简介 目标检测是计算机视觉的一个重要研究方向 是指从一个场景 或图片 中找到感兴趣的目标 任务大致分为三个流程 从场景中提取候选区 从候选区提取特征 识别候选区的类别并对有效的候选框进行位置精修 目标检测在生活的各个领域都有了广泛的
  • 算法 数列异或操作

    给你两个整数 n和start 其中n为数据的数量 start为第一个数据 当前数据定义为 num start 2 i i表示第几个数据 从0开始 请返回数列中所有数据按位异或 XOR 后得到的结果 示例 1 输入 n 5 start 0 输
  • Kali Linux 下搭建DVWA靶场和Sqli-labs注入环境

    Kali Linux 下搭建DVWA靶场和Sqli labs注入环境 DVWA靶场介绍 DVWA是一款基于PHP和mysql开发的web靶场练习平台 集成了常见的web漏洞如sql注入 xss 密码破解等常见漏洞 适合刚基础网络安全的小白
  • pytorch中的 relu、sigmoid、tanh、softplus 函数

    四种基本激励函数是需要掌握的 1 relu 线性整流函数 Rectified Linear Unit ReLU 又称修正线性单元 是一种人工神经网络中常用的激活函数 activation function 通常指代以斜坡函数及其变种为代表的
  • GMAC RGMII时序校准配置教程

    GMAC RGMII时序校准配置教程 在物联网时代 各种设备都需要联网 而其中以嵌入式系统为主 网络通信系统的核心部件即为MAC与PHY芯片 而针对MAC和PHY芯片之间的接口 有一种双数据率的接口标准 RGMII Reduced Giga
  • 一维数组与对象深拷贝的几种方法(指数组、对象中均无嵌套)

    一 万能for循环 直接上代码 var arr 1 2 3 4 5 var obj name aaaaa age 16 var arr2 copyThat arr var obj2 copyThat obj function copyTha
  • MySQL正确配置my.ini的event_scheduler = ON

    MySQL正确配置my ini的event scheduler ON 让事件的定时调度器常开 如下红框圈出部分 永久性设置方法 为何要在my ini中设置 补充mysql做一个event或job有关文章 让事件的定时调度器常开 如下红框圈出
  • 为什么数组的BUFFSIZE要定义为4096比较好?

    先看一个程序 page 69 include apue h define BUFFSIZE 4096 int main int argc char argv int n char buf BUFFSIZE while n read STDI
  • 高级计算机网络

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 RDT协议 rdt1 0 经完全可靠信道的可靠数据传输特点 rdt2 0 经具有比特差错信道的可靠数据传输 校验和 ACK NAK rdt2 1 考虑处理
  • swagger添加@ApiImplicitParams后出现错误 Required String parameter is not present

    swagger添加 ApiImplicitParams后出现错误 并且会报错 HTTP Status 400 Required String parameter xx is not present 原因是 要求post 但是 请求用的是ge
  • make编译kaldi时候遇到的各种错误

    文章目录 第一个问题 aclocal 1 14 command not found 第一个问题 aclocal 1 14 command not found tools openfst 1 6 7 missing line 81 acloc
  • line-height: 1; line-height: 100%;是什么意思

    先简单看个例子 css 页面 应该猜测出来了 line height 1 line height 100 font size 50px 把哪一个放到最后都是一样的 我理解的就是 等于字体高度的 1 整 份 或者 等于 字体高度的 100 高
  • 《这就是区块链》之区块链基础(5)--去中心化的意义

    在上一篇中 花了比较大的篇幅来阐述去中心化的概念 其实对于有计算机基础的朋友来讲 去中心化或者P2P网络并不是新颖的观点 但是 我还是希望本系列文章可以从基础展开 让所有的朋友都可以理解区块链的意义所在 今天我们来谈谈去中心化到底在区块链中
  • matlab的cylinder函数,Matlab基本函数-cylinder函数

    1 cylinder函数 绘制三维圆柱图 2 用法说明 1 x y z cylinder 函数返回一半径和高度都为1的圆柱体x y z轴的坐标值 圆柱体沿其周长有20个等距分布的点 2 x y z cylinder r 函数一个半径为r 高
  • 第十三章:软件项目管理

    第十三章 软件项目管理 一 软件项目管理总述 1 管理 管理是通过计划 组织和控制等一系列活动 合理地配置和使用各种资源 以达到既定目标的过程 2 软件项目管理 软件项目管理先于任何技术活动之前开始 并且贯穿于软件的整个生命周期之中 软件项
  • 关于新版Win10下安装虚拟机提示“Intel VT-x处于禁用状态”如何解决

    给电脑上安装虚拟机 安装的时候可能会遇到问题 提示 Intel VT x处于禁用状态 问题原因 出现这样的原因一般都是由于系统Virtualization Technology虚拟化技术功能 关闭导致的 解决方法 进入新版Win10的BIO
  • QT代码,重载函数d_func()声明形式分析和调用关系分析

    QT代码 重载函数d func 声明形式分析和调用关系分析 define X DECLARE PRIVATE Class inline Class Private d func return reinterpret cast
  • Linux uboot顶层makefile详解 一

    VERSION 2016 主版本号 PATCHLEVEL 03 补丁版本号 SUBLEVEL 次版本号 EXTRAVERSION 附加版本信息 NAME MAKEFLAGS rR include dir CURDIR rR 表示禁止使用内置
  • 快速复习一遍C++基础知识点

    暂定月计划 1实现DSA基础算法 2完成一个STL库 3在Linux上加强相关知识 4git巩固 5OJ增强代码实现能力 今天先快读复习一遍C 知识点 想把peral读完 1 引用 交换两个数示例 C语言中 void swap int a