一段代码的流程
*****
1.预处理
将头文件展开,宏定义进行替换,清除注释,if条件宏处理
2.编译
分析语法,并转成汇编
代码优化,如寄存器变量
3.汇编转二进制
4.链接
完成函数的调用和库的链接,并将它们一起打包形成可执行文件
*****
头文件保护符
#ifndef SALES_DATA_H //这里的名字可以随便取,为了规范取成跟头文化一样
#define SALES_DATA_H
include<stirng>
struct sales_data{
std::string bookNo;
unsigned unit_sold = 0;
double revenue = 0.0;
};
#endif
这种操作是为了避免一个头文件被多次包含进一个源文件里
第一次包含该头文件是会定义一个SALES_DATA_H的宏,然后一直到#endif
第二次包含的时候通过判断定义过了 SALES_DATA_H的宏,则不会往下执行到#endif这;
头文件一般不要使用using namespace xxx,因为头文件会被多个文件包含,可能会引起变量名冲突
string s;
cin>>s;
读取时会自动忽略开头的空白,知道下一处空白(空格,换行符,制表符)
如" hello world"此时cin读入的是"hello";
有时候我们希望读取的字符串能保留空格,这时候应该用getline
getline读入时遇到换行符停止(换行符也被读入进来,并把内容存到string对象,但是不存换行符)
和输入运算符一样,getline也会返回它的流参数,即可以连续读入;
while(getline(cin,s))cout<<s<<"\n";
string与加号运算符时必须有一侧是对象,另一侧可以是对象,也可以是字符字面值或者字符串字面值,也就是变量
如string s1 = "hello",s2="world";
string s=s1+s2;
string ss= s1+'a';
string sss=s1+"abc";
string t="abc"+',';//错误,不能把两个字面值直接相加
string tt="abc"+','+s;//错误,因为前面加号不能生成一个新对象;除非是 string tt="abc"+s+',';
string 对象和字符串字符串字面值不是一个概念,string是c++特有的,而字符串字面值是c和cpp都有的概念
vector表示对象的集合,其中所有对象的类型都相同。
想使用某个命名空间可以using namespace xxx;
想使用某个头文件里的对象从而不加域作用符using std::vector;
using namespace std;
std是标准库命名空间;
如果只是#include<vector>把头文件包含进来
不using std::vector 或者using namespace std;//要么单独把命名空间里的
这样用vector就需要std::vector; //命名空间的类,这样就可以直接说明用标准库的string类,而不是其他说明地方的string类;
vector是一个类模板;vector是模板而非类型
vector能容纳绝大多数类型的对象作为其元素,但是引用不是对象,所以不包含引用的vector!!!!
内置类型(int,char...),类类型(string,vector,complex),只要不是引用都能构成vector的元素;
模板后面跟一双括号,括号内填上该模板的类型
template<typename T>
class vector{
T a;//大概是这种意思
};
vector初始化和其他类类型差不多
vector<T> v1;
vector<T> v1(v2);
vector<T> v1=v2;
vector<T> v1(n,val);//n个val
vector<T> v1(n);//默认n个0;
vector<T> v1{1,2,3};//列表参数初始化
vector<T> v1={1,2,3}; //列表参数初始化