结构体
定义一个结构体
1
2
3
4
5struct Sales_data {
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};定义结构对象
1
2
3
4struct Sales_data { /* ... */ } accum, trans, *salesptr;
// equivalent, but better way to define these objects
struct Sales_data { /* ... */ };
Sales_data accum, trans, *salesptr;定义结构体以分号结束
#include
预处理器是一个在编译器之前运行的程序,并且会改变我们程序的源码。
当预处理看到一个#include
,会将指定头文件的内容替换掉#include
。
1 |
|
使用#ifndef来防止头文件被多次引用
using declaration
通过使用using
形式的定义,来简化写法,比如:using namespace::name
1 |
|
由于定义了
using std::cin
,我们可以在调用cin
函数时,不添加std::
namespace前缀。
String
在使用string之前需要引入string头文件
1
2
using std::string
定义和初始化
1 | string s1; // default initialization; s1 is the empty string |
复制初始化(copy initialize)和直接初始化(direct initialization)
当使用=
时,编译器是复制初始化,而当忽略=
时,我们使用的是直接初始化,比如:
1 | string s5 = "hiya"; // copy initialization |
读写字符串
1 | // Note: #include and using declarations must be added to compile this code int main() |
获取字符串的长度
1 | auto len = line.size(); // len has type string::size_type |
拼接字符串
1 | string s1 = "hello, ", s2 = "world\n"; |
1 | string s1 = "hello", s2 = "world"; // no punctuation in s1 or s2 |
注意
+
符号两边至少要有一个string类型,不能是字符字面量相加
1 | string s4 = s1 + ", "; // ok: adding a string and a literal string |
1 | string s6 = (s1 + ", ") + "world"; |
相当于:
1 | string tmp = s1 + ", "; // ok: + has a string operand |
1 | string s7 = ("hello" + ", ") + s2; // error: can't add string literals |
(“hello” + “,”) 符号两边都是常量
Exercise 3.3: Explain how whitespace characters are handled in the string input operator and in the getline function.
对于string类的输入函数,它会自动忽略开头的空白(空格、制表符、换行等等),从第一个真正的字符开始直到下一个空白。
对于getline()函数,它会保存字符串中的空白符,它读入数据,直到遇到换行符位置。
1
2
3
4
5
6
7
8 int main()
{
string line;
// read input a line at a time until end-of-file
while (getline(cin, line))
cout << line << endl;
return 0;
}