一 audo
C++11中引入的auto主要有两种用途:自动类型推断和返回值占位。auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除。前后两个标准的auto,完全是两个概念
auto自动类型推断,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推断,可以大大简化我们的编程工作。
map<int, map<int,int> > map_;
以下定义很复杂。
map<int, map<int,int>>::const_iterator itr1 = map_.begin();
用auto 很简便。 但是个人觉得可读性差
const auto itr2 = map_.begin();
二 extern
extern 关键字用了声明另一个文件中存在的全局变量,是的本文件可以使用这个数据。
三 register
register 关键字告诉编译器“尽可能快的访问这个变量”。但是特不能保证是寄存器变量。
register 不能用来声明全局和静态变量
四 内部连接和外部连接
内部连接意味着只对正在编译的文件创建存储空间。 用内部连接别的文件可以使用相同的标识和全局变量
外部连接为所有被编译的文件创建一片单独的存储空间。
函数之外定义的所有变量(C++ 中除了const) 和函数定义默认为外部连接。
可以使用关键字static特地前置它们具有内部连接。
五 函数参数为数组
对于C++, 数据标识符可以看做是数组起始处的只读指针。如果声明一个数据为函数参数, 实质声明的是一个指针。
void func1(int a[], int size){
for(int i=0;i<size;i++)
a[i]=i*i-1;
}
void func2(int* a,int size){
for(int i=0;i<size;i++)
a[i]=i*i-1;
}
以上两个函数完全相同。
六 atoi() atol()和atof()
atoi() atol()和atof() 可以将ASCII字符数组分别转换为int,long,double。
如atoi(argv[i]);
七 动态存储空间分配
对于C语言, 使用malloc(),calloc(),realloc()申请存储空间。 用free() 函数释放内存空间
对于C++,使用关键字new 申请存储空间, 用delete 释放存储空间。
八 Struct
C++作为对象语言,可以在Struct 中定义函数,这样Struct可以作为对象使用。
与class 的唯一区别是,Struct 的成员默认为public,class 对象的成员默认为private.
九 作用域解析运算符 ::
用于指定函数属于哪个对象。
如:void stash:: inflate(int increase) 是stash 对象的inflate 函数。
C++ 不能调用未事先声明的对象。 声明一般在头文件中。 主要是定义对象, 并声明属于对象的字段和函数。
函数中可以使用this 来指定这个对象的地址。
十 function const
以上的函数 不能修改类的非static 成员。
如:int val() const {
j=3; // j 是static 成员
return i; // i 可以是非static 成员
}
十一 默认参数
static void print(const String msg =""){
}
函数参数为常量字符串, 如果没有传入参数, 默认为空。
十二 C++ 继承语法
class X{
int i;
public :
X() {i=0;}
void set(int ii) {i= ii};
int read() const {return i;}
int permute() {return i= i*47;}
}
class Y: public X{
int i;
public :
Y() {i=0;}
int change () {
i=permute();
return;
}
void set(int ii) {
i=ii;
X::set(ii);
}
}
从以上程序可以看到,
如果派生类没有相同的函数名, 可以直接调用(permute());
如果派生类有相同的函数名, 调用基类函数, 必须标出基类名称(X:: set(ii))。
十三 函数捆绑
把函数体与函数调用向联系称为捆绑。 早捆绑:捆绑在程序运行之前。 晚捆绑:捆绑发生在运行时。
但是为了完成继承的多态变换。 C++ 必须实现晚捆绑。所以C++ 提供了虚函数关键字virtual。
标志为virtual 的函数, 被继承后是晚捆绑。
十四 纯虚函数的声明和作用
纯虚函数的声明同样适用关键字 virtual, 并且在其后面加上 =0。
如: virtual void f() =0;
包含纯虚函数的类是个抽象类。 抽象类不能生成对象。
必须被继承,实现纯虚函数后才可以生成对象。