C++学习笔记(更新中)
C++学习笔记
基础的输入与输出
输出工具
cout
1
cout << "Hello World"; // 输出Hello World
cout可根据变量类型自动识别输出格式,免去printf中要使用的如
%d
的格式控制符。换行符
endl
1
cout << "Hello World" << endl; // 输出Hello World并换行
等效于输出
"\n"
输入工具
cin
1
2int a;
cin >> a; // 输入a的值cin根据变量类型自动识别输入格式,免去scanf中要使用的如
%d
的格式控制符。插入运算符
<<
和>>
指明信息流动的路径
cout是一个ostream类对象,cin是istream类对象,它们都定义在iostream头文件中。要使用cout和cin,必须在程序开头包含iostream头文件,并使用
using namespace std;
编译指令使std
名称空间内的名称可用。
数据处理
以
{}
方式初始化时进行的转换也被称为统一初始化或列表初始化,旨在为各种类型的初始化提供一套统一且更安全的语法。在类型转换方面,它引入了更严格的检查规则。
其禁止窄化转换(即可能导致数据丢失的转换),但允许安全转换(不会导致数据丢失)。
强制类型转换
表示方式:
1
2(type) value;
type (value);强制类型转换不会改变变量本身,而是返回一个转换后的新值。
C++还引入了4个强制类型转换符,其使用要求更为严格:
static_cast<>
可将值从一种数值类型转换为另一种数值类型
1
static_cast<typeName> (thorn)
等待补充
C++11新增的auto关键字
1
auto item = value;
编译器根据初始化表达式推断变量的类型。该声明方式适合处理复杂的类型,如STL(标准模块库)容器类型。
字符串
\0
表示空字符,用于标记字符串的结尾,不以\0
结尾的只能被称为字符数组而非字符串。可用插入\0
的方式截断字符串。读取字符输入的函数:
in C:
gets(char *str)
:
读取整行输入直到遇到换行符,同时添加空字符使其成为字符串。gets函数不检查缓冲区是否溢出,故已在新标准中被废除。(对应的puts()
会在字符串末尾自动添加换行符)fgets(char* str,int n,FILE *stream)
:读取到n-1个字符或遇到换行符时停止,其将换行符一并读入数组中。(对应的fputs()
不会在末尾添加换行符)gets_s(char *str,rsize_t n)
:增加一个参数限制读取长度,其余与gets一致。s_gets(char *str,int n)
:自定义函数,为fgets添加替换换行符为空字符的功能。
in C++:
cin.getline(char*str,int n)
:读取整行,第二个参数为要读取的字符数,当其为n,函数最多读取n-1个字符,最后一个字符设置为空字符,该成员函数在读取指定书目的字符或遇到换行符时停止读取。cin.get(char*str,int n)
:读取到行尾,但是该成员函数读取到换行符时停止,换行符被留在缓冲区中。其另一种用法是不带任何参数时调用,只读取一个字符(包括换行符),可用于处理换行符,为下一行输入做准备。getline(cin,str)
:其不是istream类的类方法,将cin作为参数表明其到何处查找输入,其也无需指出长度,因为其接受的输入Str是string对象,会自动调整大小。
string类
需包含string头文件(不是cstring或string.h),其初始化操作(包括列表初始化)、使用cin/cout进行输入输出、用数组表示法访问其中字符的方式与C风格字符串相同。
区别:
- 可将string对象声明为简单变量,可突破不能将一个数组赋值给另一个数组的限制。
- 其简化了字符串合并操作,可使用加法运算符将两个字符串连接起来。而且string可自动调整大小,不用关心长度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using namespace std;
int main() {
// C 风格字符串
char str1[20] = "Hello";
strcat(str1, " World"); // 拼接,需保证数组够大
cout << str1 << endl;
// C++ string
string str2 = "Hello";
str2 += " World"; // 自动扩展,无需关心长度
cout << str2 << endl;
return 0;
}其他形式的字符串字面值
除char类型外,C++还支持wchar_t、char16_t和char32_t类型的字符串字面值。这些字符串字面值的前缀分别是L、u和U。表示示例如下:1
2
3wchar_t title[]=L"hello"; // 宽字符字符串
char16_t name[]=u"hello"; // Unicode字符16位字符串
char32_t car[]=U"hello"; // Unicode字符32位字符串还有一种新增的类型是原始字符串raw,字符表示自己而不进行转义,其前缀为R,表示示例如下:
1
const char* quote = R"(Jim "King" Smith)";
杂项
sqrt()
函数返回平方根