一、 C++ 中cast 意为强制类型转换 , const_cast 去除const特性; static_cast 类型
静态
转换 float f; static_cast<int>(f);
dynamic_cast 将指向基类的指针动态转换为指向派生类的指针 Base* p; Derive* pp = dynamic_ cast<Derive*>(p) ;
二、 explicit(显示的) 抑制抑制隐式转换。
explicit 只对构造函数起作用,用来抑制隐式转换。如:class A {A(int a);};int Function(A a);A a = 2; // right, equal to: A a = A(2);当调用 Function(2) 的时候,2 会隐式转换为 A 类型。这种情况常常不是程序员想要的结果,所以,要避免之,就可以这样写:class A {explicit A(int a);};int Function(A a);A a = 2; // error, explicit
这样,当调用 Function(2) 的时候,编译器会给出错误信息(除非 Function 有个以 int 为参数的重载形式),这就避免了在程序员毫不知情的情况下出现错误。
总结:explicit 只对构造函数起作用,用来抑制隐式转换。
三、 注意二维数组的参数传递
funct(int a[10]); funct(int a[],int n); funct(int *a, int n);
funct(int a[10][10]); funct(int a[][10]); //二维数组做参数必须指定列数
四、 ifstream fin("input.txt");
string str;
getline(fin,str);
五、 const int row = 5;
const int col = 3;
vector<vector<int> > a(row,vector<int>(col));
相当于动态定义二维数组 a[row][col]
a.~vector();
六、模板内的迭代器定义要加上typename关键字
typename vector<T>::iterator iter;
七、 malloc/ free C库函数,分配内存不会调用构造函数和析构函数,初始化必须调用初始化函数。在C++中保留为了能够调用C函数,因为C
只支持malloc/free
new /delete 操作符; A* pa = new A; 分配并初始化
重载new操作符: friend void* operator new(size_t size) { }
八、 point(const point& p)
{
x = p.x;
y = p.y;
}
这种做法是正确的: point p( point(5,6) ); 无名临时对象遇到分号即销毁,调用拷贝构造函数时仍然存在。
九、
。
十、 extern int i; 声明外部变量;
volatile int i; 定义变量i, 它每次使用时都必须从内存中读取
mutable int i; 定义可更改的变量,即使在const成员函数中也能被更改。