2021.4.20学习笔记

C++学习

命名空间

一、定义:namespace 名字{变量、函数}
二、使用方法
1、使用作用域限定符:命名空间的名字::变量名或者函数名
2、使用using关键字导入明明空间:using 命名空间(可能多个命名空间含有相同变量名产生二义性) 或者 using 命名空间::变量名或者函数名
(::是作用域限定符)
using namespace std:标准库命名空间
作用:C++为了防止和C冲突,将新的一些函数定义在标准库中。
注意事项

1、源文件不能访问其他源文件的命名空间
2、当多个源文件的命名空间名字相同时:
如果两个命名空间函数名或者变量名没有出现重复,就会合并,可理解为追加
如果两个命名空间有相同的函数名或者变量名,就会报错

输入输出

对象

1、cin:输入流
2、cout:输出流:cout << "ch = " << ch << endl
3、cerr:错误流
4、clog:日志流

流运算符

1、>>:输入
2、<<:输出

注意事项

1、printf:行缓冲(满一行或者遇到"\n"输出)

使用printf调试时,一定要加"\n"或者手动刷新缓冲区

2、scanf:输入前,刷新缓冲区
3、cout:也是行缓冲,加上endl

C++对C的实用性加强

基本语句的升级

1、for语句:优化了循环变量的作用域
2、条件表达式:可以做左值

关键字的升级

1、register关键字的升级:若对一个register变量取地址,会将该变量重新保存到内存中。

C语言中:尽可能的将该变量保存到cpu内部寄存器中,从而省去从内存中抓取数据的时间,提高程序运行的效率;

C语言中register使用注意事项:

只能修饰局部,不能修饰全局变量和函数
C语言中register修饰变量,不能通过&获取该变量的地址
register修饰的变量类型,必须是时cpu所能够接受的类型

2、const关键字的升级:const修饰的变量是常量

C语言中const修饰的变量是只读变量
地址之间的赋值必须是const对const

3、auto关键字:类型推导,实现高效编程
string::interator it = s1.begin();
aoto inter2 = s1.begin();
这样两个类型就一致了

C语言中auto关键字:自动变量,只是用来说明该变量的作用域;相当于局部变量

4、using关键字的升级:替代C语言中的typedef的关键字
typedef关键字的作用:给类型重命名;提高代码的可读性、移植性;

类型的升级

1、引入了bool类型
2、引入了”引用“
1、定义:给变量起别名,定义引用必须初始化,一旦绑定就不能再次绑定到其他变量上。
2、作用:解决了函数传值和传地址的问题。
3、应用场景:作为函数的形参,作为函数的返回值(函数调用可以用作左值)
4、常引用:const修饰的引用,绑定常量
5、引用的分类
在这里插入图片描述

左值引用(&):只能绑定在左值;右值引用(&&):只能绑定在右值
左值:可以取地址,可以修改
右值:不可以取地址,不可以修改
右值引用的目的:实现对象移动,解决临时对象拷贝开销问题;
std::move():将左值转化成右值

6、引用是不是数据类型?占不占用内存空间?
引用不是数据类型,运行时不占用内存空间,编译时预留内存空间!
7、指针和引用的区别?
二者区别:(1)引用访问一个变量是直接访问,而指针是间接访问。
(2)引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间,指针是一个实体,而引用不是。
(3)引用在开始的时候就绑定到了一个内存空间(开始必须赋初值),所以他只能是这个内存空间的名字,而不能改成其他的,当然可以改变这个内存空间的值。
8、什么是对象移动?作用是什么?
对象移动:把动态内存内容的管理权限进行交接,从外部看,仿佛内存内容从一个对象中移动到了另一个对象中,没有拷贝出一份新的内存内容。
作用:移动构造函数不会因拷贝资源而分配内存,仅仅接管源对象的资源,提高了效率。

C语言中传地址,才可以改变两个实参的值。

用new、delete运算符来替代malloc、free

1、malloc 按照字节为单位,new按照数据类型的个人为单位
2、malloc不能初始化内存,new可以初始化
3、malloc是函数,new是运算符

C++对C的升级

函数的升级

1、引入inline关键字修饰函数:用(内存)空间换运行时间(减少函数的调用和返回)
限制:

内联函数不可含有循环
内联函数不可含有静态变量
内联函数不可为递归函数
内联函数不可含有错误处理

注意事项:一般内联函数必须在第一次调用之前

2、引用了默认参数:可以给形参设定默认参数(规则:默认参数右边的参数必须全为默认参数)
3、可以使用函数的重载:可以使用相同函数名,重载规则:形参的个数、类型或者顺序不同。

初始int add(int a,int b)
重载1:int add(int a,int b,int c)
重载2:int add(char a,char b)
重载3:int add(int b,int a)

注意事项:函数返回值不能作为重载条件;默认参数值会影响重载。

4、引入了参数占位符
int add(int a,string b,int)
最后一个int为参数占位符,提示以后可能会升级.

结构体的升级

(1)定义方式不同:
C中定义:strcut Student stu;
C++中定义:Student stu;
(2)结构体中可以保存函数
(3)可以设置权限
public:可以在结构体内外访问
private/protected:只能在结构体内访问
(4)可以继承
(注)class VS struct

区别
默认访问权限:class 默认private struct默认public
命名:class(类) struct(结构体) class定义称之为对象 struct定义称之为变量
类内实现的方法,编译器会优化为inline函数,所以成员方法最好类外实现

为什么引用类?
具有封装性(保证代码功能的独立:设置访问权限)->提高代码维护性

string类

1、定义并初始化

string s1 = “hello world”;

2、属性

cout << s1.size() << endl;返回有多少个字符
cout << s1.length() << endl;长度=size

3、遍历

(1)支持数组的访问方式
(2)通过函数访问

区别:

[ ]不会检查后是否越界
at检查:如果越界,产生异常->更加安全

for函数:
foeach函数:
迭代器(类似于指针):
获取指向第一个字符的迭代器
获取指向最后一个字符的迭代器
正向迭代器:
反向迭代器:
在这里插入图片描述

4、插入

string &insert(int p0, const char *s);
string &insert(int p0, const char *s, int n);
string &insert(int p0,const string &s);
string &insert(int p0,const string &s, int pos, int n);
//前4个函数在p0位置插入字符串s中pos开始的前n个字符
string &insert(int p0, int n, char c);//此函数在p0处插入n个字符c
iterator insert(iterator it, char c);//在it处插入字符c,返回插入后迭代器的位置
void insert(iterator it, const_iterator first, const_iterator last);//在it处插入[first,last)之间的字符
void insert(iterator it, int n, char c);//在it处插入n个字符c

5、删除

iterator erase(iterator first, iterator last);//删除[first,last)之间的所有字符,返回删除后迭代器的位置
iterator erase(iterator it);//删除it指向的字符,返回删除后迭代器的位置
string &erase(int pos = 0, int n = npos);//删除pos开始的n个字符,返回修改后的字符串

6、替换

string &replace(int p0, int n0,const char *s);//删除从p0开始的n0个字符,然后在p0处插入串s
string &replace(int p0, int n0,const char *s, int n);//删除p0开始的n0个字符,然后在p0处插入字符串s的前n个字符
string &replace(int p0, int n0,const string &s);//删除从p0开始的n0个字符,然后在p0处插入串s
string &replace(int p0, int n0,const string &s, int pos, int n);//删除p0开始的n0个字符,然后在p0处插入串s中从pos开始的n个字符
string &replace(int p0, int n0,int n, char c);//删除p0开始的n0个字符,然后在p0处插入n个字符c
string &replace(iterator first0, iterator last0,const char *s);//把[first0,last0)之间的部分替换为字符串s
string &replace(iterator first0, iterator last0,const char *s, int n);//把[first0,last0)之间的部分替换为s的前n个字符
string &replace(iterator first0, iterator last0,const string &s);//把[first0,last0)之间的部分替换为串s
string &replace(iterator first0, iterator last0,int n, char c);//把[first0,last0)之间的部分替换为n个字符c
string &replace(iterator first0, iterator last0,const_iterator first, const_iterator last);//把[first0,last0)之间的部分替换成[first,last)之间的字符串

C++独有的类型的转换

隐式转换和显式转换

(1)static_cast:相关类型转换(隐式类型转换),父类和子类,void *和其他类型指针的转换。
优点:做类型检查(检查类型是否可以转换)
(2)reinterpret_cast:相当于C语言的强制类转换,可以将任意指针类型进行转换。
(3)const_cast:将指针或者引用的const属性去除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值