1、#define add(a+b) a+b
int
main() {
printf(
"%d\n"
,
5
* add(
3
+
4
));
return
0
;
}
宏为简单替换,此处应该为5*3+4=19;
2、std::vector::at 和 std::vector::operator[] ,
at总是做边界检查, operator[] 不做边界检查.
vector<
int
> v;
v.reserve(10);
for
(
int
i=0; i<7; i++)
v.push_back(i);
try
{
int
iVal1 = v[7];
// not bounds checked - will not throw
int
iVal2 = v.at(7);
// bounds checked - will throw if out of range
}
catch
(
const
exception& e)
{
cout << e.what();
}
3、
4、 内联函数是编译器就展开的,把代码镶嵌就程序,虚函数是动态绑定,运行期决定的。所以内联函数不能是虚函数int (*a[10])(int); //函数指针的数组,指向有一个参数并且返回类型均为int的函数的数组int (*a)(int);//函数指针,指向有一个参数并且返回类型 均为int的函数int *a[10]; //指向int类型的指针数组a[10]int (*a)[10]; //指向有10个int类型数组的指针a
虚函数是为了实现动态绑定,不能声明为虚函数的有:
1、静态成员函数; 2、类外的普通函数; 3、构造函数; 4、友元函数
此外,还有一些函数可以声明为虚函数,但是没有意义,但编译器不会报错,如:
1、赋值运算符的重载成员函数: 因为复制操作符的重载函数往往要求形参与类本身的类型一致才能实现函数功能,故形参类型往往是基类的类型,因此即使声明为虚函数,也把虚函数当普通基类普通函数使用。
2、内联函数:内联函数目的是在代码中直接展开(编译期),而虚函数是为了继承后能动态绑定执行自己的动作(动态绑定),因此本质是矛盾的,因此即使内联函数声明为虚函数,编译器遇到这种情况是不会进行inline展开的,而是当作普通函数来处理。因此声明了虚函数不能实现内敛的,即内敛函数可以声明为虚函数,但是毫无了内联的意义
5、
unordered_map:是所谓的哈希map,很容易就选了hashtable
priority_queue:是所谓的优先级队列,说白了就是一个二叉堆,所以底层应该是用heap实现,并非名字中的queue
6、
char *p[10] 是指针数组,数组里存放了10个指针,在64位系统下指针占8个字节,所以sizeof(p) = 10 * 8 = 80.
char (*p1)[10]是数组指针,p1是一个指向存放10个char类型的数组的指针,所以sizeof(p1) = 8.
7、
static用法
1:设置静态局部变量,变量只定义一次,不能被别的函数使用
2:设置静态全局变量,变量不能被外部文件所使用
3:在类中设置静态函数,只能访问静态变量
8、
全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。
静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量。