标准库类型
涉及命名空间的声明分为两种:命名空间指令与命名空间声明
using namespace::std;
是命名空间指令,加入该语句后,可使用std中定义的所有标识符
using std::cin;
using std::cout;
命名空间的使用,提供了一种机制使得程序段中变量名不冲突,可将同名变量声明在不同的命名空间内。
是命名空间声明,应注意的是:一个using声明只作用于一个命名空间成员
两者相比之下,命名空间声明要更加安全,因为命名空间指令中的冲突直接覆盖,而命名空间声明遇到冲突给出一个程序错误。
没有使用using声明而直接使用命名空间中名字为限定版本是一种常见错误。
cin读取字符串读到空格,换行,制表为止(只读一个单词)
如果想要读入未知数目的string对象我们通常使用
string word;
while(cin>>word)
{...}
同时,我们也可以使用函数getline读整行文本
函数getline(参1,参2)
其中参1是输入流(从该流的下一行开始读)
参2string(读后保存的位置)
应该注意的是,函数getline不会忽略开头的换行符
string类中string.size()为其大小,string.empty()是否为空。
vector类是一个类模板
vector<string> svec(10,"hi!");
定义了10个字符串,调用第n个与数组方式相同,即svec[n-1],和数组一样不可以越界复制,否则导致缓冲区溢出。
auto
(变量的缺省类型) 用于临时存储变量,具有生命周期,生命期结束后存储空间可以被其他自动变量覆盖使用
static
静态类型,在程序的整个生命周期内都有效
内联声明 inline
内联声明inline只出现在函数声明中,不出现在函数定义中
编译时在调用处用函数体进行替换,节省了参数传递、 控制转移等开销。
内联声明适用于一个代码段不长且被频繁调用的函数
内联函数的声明必须出现在内联函数第一次被调用之前
inline void Swap(int& a, int& b) //由于既是声明也是定义,所以有inline
{ int t;
t=a;
a=b;
b=t;
}
int main()
{
int a(5), b(10);
Swap(a,b);
return 0;
}
函数重载
函数重载必须形参不同,个数不同或类型不同
不以形参名与返回值类型区分重载,会重定义报错
数组和指针
数组初始化:函数体外的内置数组,元素初始化为0;函数体内定义的无初始化,若为类类型,则调用一些类时有默认构造函数,若无,则需显式初始化。
string *p1,p2;
这里只将p1声明为指针,p2为string类。
将指针声明写成
string *p1,*p2;
是一种比较好的编程习惯
指针在使用前应初始化
c风格的字符串(以‘\0’结尾的数组)常常容易引起错误,与其相比,string类型更加安全。
动态数组的创建
int *p=new int[10];//new返回首元素地址
对于未知长度的动态数组,我们通常使用:
size_t n=get_size();
int *p=new int[n];
删除数组p对应的语句为
delete [ ] p;
应注意的是:在delete一个指针后,将其置为0为佳。
二维数组作参数
void foo1(int (*matrix)[col])//传参方法一
{...}
void foo2(int matrix[][col])//传参方法二
{...}
这里第一种方法中的()是必需的
main函数中的数组参数
int main(int argc,char *argv[])
{
cout << argc<<endl;
cout << argv[0]<<endl;
}
这里的argc是数组长度,数组argv[0]保存的是编译后生成的exe文件的路径
return的类型
void 型:return;
非void型:return 表达式;
应注意的一点是:一定不要返回对局部对象的引用与指针(因为局部对象在函数结束时其内存空间已被释放,这样的返回值会指向一个未知对象的引用或指针)
类中默认构造函数的定义
class Sales_item{
public:
...
Sales_item():units_sold(0),revenue(0.0) {}
}
创建的所有未初始化的类对象,都被这个函数初始化