这周我学习了c++,于是我打算用写博客的方式加深印象
目录
1.c++相比c语言多了的两种类型
1.
布尔类型 | bool |
布尔类型
布尔常量共有两个,它们都是标准的 C++ 关键字:
- true 值代表真。
- false 值代表假。
我们不应把 true 的值看成 1,把 false 的值看成 0。
2.
宽字符类型 | wchar_t |
宽字符类型
如果常量以 L(仅当大写时)开头,则表示它是一个宽字符常量(例如 L'x'),此时它必须存储在 wchar_t 类型的变量中。否则,它就是一个窄字符常量(例如 'x'),此时它可以存储在 char 类型的简单变量中。
2.c++中的一些类型限定符
C++ 中的类型限定符
类型限定符提供了变量的额外信息。
限定符 | 含义 |
---|---|
const | const 类型的对象在程序执行期间不能被修改改变。 |
volatile | 修饰符 volatile 告诉编译器不需要优化volatile声明的变量,让程序可以直接从内存中读取变量。对于一般的变量编译器会对变量进行优化,将内存中的变量值放在寄存器中以加快读写效率。 |
restrict | 由 restrict 修饰的指针是唯一一种访问它所指向的对象的方式。只有 C99 增加了新的类型限定符 restrict。 |
3.c++的存储类
- auto
- register
- static
- extern
- mutable
- thread_local (C++11)
1.auto
自 C++ 11 以来,auto 关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。
C++98标准中auto关键字用于自动变量的声明,但由于使用极少且多余,在C++11中已删除这一用法。
2.register
register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。
emmm,对于register 的理解,我在网上找到一些信息:
1.用register修饰的变量只能是局部变量,不能是全局变量。CPU的寄存器资源有限,因此不可能让一个变量一直占着CPU寄存器。
2.register变量一定要是CPU可以接受的值。
3.在C语言中的register修饰的变量表示将此变量存储在CPU的寄存器中,由于CPU访问寄存器比访问内存快很多,可以大大提高运算速度。
4.不可以用&运算符对register变量进行取址。
5.register只是请求寄存器变量,不一定能够成功。
3.static
static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
在 C++ 中,当 static 用在类数据成员上时,会导致仅有一个该成员的副本被类的所有对象共享。
我感觉是说,在自定义的函数中用static定义的变量在主函数中也不会消失。
4.extern
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 'extern' 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。
应该是说,当一个变量以extern的方式定义后,就可以在多个文件里使用了。
5.mutable
mutable 说明符仅适用于类的对象。它允许对象的成员替代常量。也就是说,mutable 成员可以通过 const 成员函数修改。
如果需要在const成员方法中修改一个成员变量的值,那么需要将这个成员变量修饰为mutable。即用mutable修饰的成员变量不受const成员方法的限制。
emmm,难道是说,用了mutable就可以改变用const定义的值了?
6.thread_local
使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。
thread_local 说明符可以与 static 或 extern 合并。
可以将 thread_local 仅应用于数据声明和定义,thread_local 不能用于函数声明或定义。
4.c++ 中的 String 类
首先要定义它的头文件
#include<string>
1.声明一个string类型变量
以下是我在网上找到一些信息:
string a;
a = "hello"; //给a赋值 “hello”
char b[]="world";
string a1(a); //调用构造函数生成a1,a1是a的复制
cout << a1 <<endl;
string a2 (a,2); //这个意思是从a的第二个字符开始复制
cout << a2 <<endl;
string a3(a,2,2); //这个意思是从a的第二个字符开始复制两个字符
cout << a3 <<endl;
string a4(b); //这是以b字符串作为初值
cout << a4 <<endl;
string a5(b,3); //这是将b字符串的前三个作为初值
cout << a5 <<endl;
string a6(5,'c'); //这是以5个字符c作为初值
cout << a6 <<endl;
string a7(a.begin(),a.begin()+2); //以区间a.begin()到a.begin()+2之间的字符为初值
cout << a7 <<endl;
结果为
2.string的比较
在c++中string的比较相比c语言中的字符串比较要简单不少。
只要用>,<,==,>=这些数学符号就可以,还可以可以用+或者+=操作符连接两个字符串。
3.string的查找
查找时,常会用到string.find和string.rfind:
string a="hello";
int b;
b=a.find("o"); //查找字符o在a中的第一个位置
cout << b <<endl;
b=a.find("ell"); //查找字符串"ell"在字符串a中第一次出现的位置
cout << b <<endl;
b=a.find("elu",0,2);//从下标0开始查找"elu"字符串的前两个字符
cout << b <<endl;
b=a.find("d"); //当找不到时返回-1
cout << b <<endl;
b=a.find("o",5); //从下标5开始往后查找查找
cout << b <<endl;
b=a.rfind("l"); //查找字符l在a中从后往前的第一个位置
cout << b <<endl;
b=a.rfind("ell"); //查找字符串"ell"在字符串a中从后往前第一次出现的位置
cout << b <<endl;
b=a.rfind("l",2); //从第五个字符开始向前查找
cout << b <<endl;
结果为
这是我这周的学习笔记,仅供参考,如有错误,欢迎大佬指正。