1 开发环境
- 有两种方式:
-
- 使用集成开发工具
- 使用编译器:建议使用免费的GNU
-
-
- GNU在linux中通过sudoapt install c++进行安装,安装前通过 c++-v测试没有异常,说明已经安装。
- GNU使用编译使用命令与C语言相似,只需要把gcc改为g++.
-
2 输入输出
- 输入和输出并不是C++语言中的正式组成成分,C和C++本身都没有为输入和输出提供专门的语句结构。
- 输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。
- C++的输出和输入是用“流”(stream)的方式实现的。在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。
- 在执行输入输出语句时,先把数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到输入输出语句中的endl(或′\n′,ends,flush)为止。
3 格式控制
3.1 预定义操作
要导入头文件<iomanip>,并且都属于名字空间std。
(a) std::setw(n) 设置输出宽度, 只对后面一次输出生效。 除了这个,其他的都是永久性的。
(b) std::setfile(char) 设置填充字符
(c) 设置输出进制
std::hex或std::setbase(16) 设置16进制输出
std::oct或std::setbase(8) 设置8进制输出
std::dec或std::setbase(0) 设置10进制输出
(d)getline(cin, string) 获取一行的输入,空格会被接受。
在调用之前加 cin>>ws; 将去掉开始的空格,如
string str;
cin>>ws;
getline(cin,str);
(e) std::flush 刷新输出
(f) std::setprecision(n) 设置精度 即输出数字个数 只对浮点数生效(float, double)
double a = 23.32; cout<<setprecision(3)<<a<<endl;//23.3
3.2 状态标志流操作
- cout.setf(flags),可以设置多个标志,标志之间使用 '|' 隔开。
- cout.unsetf(flags),取消设置
flags的值可以是:
- ios::left, ios::right, 设置左右对齐
- ios::showpos设置显示正负号
- ios::scientific 设置科学计数法输出 只针对浮点数才生效。
- ios::fixed 设置6位小数输出
3.3常见字符串操作
- c_str()把string转换成c风格的字符串,只能使用const char *类型来接收。
- int size(); //返回当前字符串的大小。遇\0结束的长度
- int length(); //返回当前字符串的长度。遇\0结束的长度
- bool empty(); //当前字符串是否为空。 字符串长度为0时,返回1, 长度大于0时, 返回0。
- char at(int index); 根据索引获取字符, 等价于string[int index]
- string append(string);连接字符串
- int find(string), 参数表示子符串在调用字符串中的首字母索引,找不到返回-1.
- 删除
erase()
-
-
-
-
-
- erase(pos, n):删除从pos位置开始的n个字符, 当余下的字符不足n个时,有多少删除多少。
- erase(pos):删除从pos位置开始的所有字符。
-
-
-
-
- 插入
insert( )
string insert(size_t pos, const string& str);从第pos的位置插入字符串str。
string insert(size_t pos, constchar* s, size_t n);
constchar* s 如果传的是c风格的字符串,将在字符串的第pos的位置插入s,只插入前n个。
constchar* s如果传的是c++风格的字符串,将在字符串第pos的位置插入,从s的第n个位置之后的字符全部插入到字符串中。
string str = "123456"; string s = "ABCDEFG"; str.insert(1,s,3); cout<<str<<endl;//1DEFG23456
string str = "123456"; char *s1 = "ABCDEFG"; str.insert(1,s1,3); cout<<str<<endl;//1ABC23456
3.3.1 字符串比较
使用:==、!=、<、>、<=、>= 或使用string.compare(string)
- int compare(string)比较大小
大于返回正整数,小于返回负整数,等于返回0.
3.3.2 字符串反转
需要加入头文件 <algorithm>
std::reverse(str.begin(), str.end());把字符串进行反转
4 变量引用 reference
对一个数据可以使用“引用”,这是C++对C的一个重要扩充,引用是一种新的变量类型,它的作用是为一个变量起一个别名。
int a = 100; int &b = a;//为a表示的内存空间增加一个名字b
5 内联函数
- 函数被inline修饰,这样的函数是内联函数,又称内嵌函数或内联函数。在编译时将所调用函数功能的代码直接嵌入到主调函数中。这样可以避免频繁调用的小函数大量消耗栈空间(栈内存)的问题。
- inline 函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。
- inline 的使用是有所限制的,不能包含复杂的结构控制语句例如 while、switch等。
总结
- 表面上调用函数,实质是把调用函数功能的代码替换到该位置。
- 内联函数和需要使用的地方需要在同一个文件才可能是内联函数。
6 函数重载
函数重载是多态的一种体现
C++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同。这就是函数的重载(functionoverloading)。即对一个函数名重新赋予它新的含义,使一个函数名可以多用。
- C++允许赋予函数参数默认值,即在调用该函数时,可以不写某些参数的值,编译器会自动把默认值传递给调用语句中。
- 默认值可以在声明或定义中设置;也可在声明或定义时都设置,都设置时要求默认值是相同的。 (在声明中定义更可靠)
注意事项:
- 如果不是在声明中设置默认值,而在定义中设置,那么定义一定要放在函数调用之前, 不能将实际值传递给引用类型的参数。(不推荐使用)
- 可以将变量作引用类型参数的默认值,这时变量必须是已经声明且是全局变量 。
- 若给某一参数设置了默认值,在该参数后面的参数都需要设置默认值。
- 在调用时,若给已经设置默认值的参数传递实际值,既要取代默认值,在该参数的左边的参数都需要传递实际值。