1
/ddd 对应1-3位8进制位数所代表的字符
/xhh表示1-2位16进制位数所代表的字符
举例说 /101 是8进制数,代表10进制的65,那么他代表的就是对应数字65的字符(A)
2
宏定义 即Define时 一定不要带“;”
3
#include using namespace std; #include int main() { string *a="123"; cout < <*a; } 错误原因 string对象需要new来赋值,你直接给它一个"123"不能创建一个string对象 修改 string a="123";现在a 只是一个引用 指向字符串字面值地址。
4void func1()
{
int *pa = NULL;
func2(pa);
delete pa;
}
void func2(int *pb)
{
pb = new int(5);
}
错误 局部变量,应该用指针的引用 即void func2(int *&pb)
5 动态设置按钮的显示文本:
m_setcaption.SetWindowText("下一个");
*p++相当于*(p++),先算p++,不过p++的返回值是p未加1的值,所以*p++这个表达式的值等于*p,不过前者会使p变化,就这道题而言,*p++ = a[2] = 3,完了p指向a[3]
6 当较大对象作为参数是一般使用引用是因为如果不用引用 而使用复制的话开销会很大,同时为了防止引用时对象被修改,最好加上const修饰符
应该将不修改相应实参的形参定义为 const 引用。如果将这样的形参定义为非 const 引用,则毫无必要地限制了该函数的使用。例如,可编写下面的程序在一个 string 对象中查找一个指定的字符:
// returns index of first occurrence of c in s or s.size() if c isn't in s // Note: s doesn't change, so it should be a reference to const string::size_type find_char(string &s, char c) { string::size_type i = 0; while (i != s.size() && s[i] != c) ++i; // not found, look at next character return i; }
这个函数将其 string 类型的实参当作普通(非 const)的引用,尽管函数并没有修改这个形参的值。这样的定义带来的问题是不能通过字符串字面值来调用这个函数:
if (find_char("Hello World", 'o')) // ...
虽然字符串字面值可以转换为 string 对象,但上述调用仍然会导致编译失败。
通常,函数不应该有 vector 或其他标准库容器类型的形参。调用含有普通的非引用 vector 形参的函数将会复制 vector 的每一个元素。从避免复制 vector 的角度出发,应考虑将形参声明为引用类型。然而,看过第十一章后我们会知道,事实上,C++ 程序员倾向于通过传递指向容器中需要处理的元素的迭代器来传递容器:
7void printValues(int*) { /* ... */ } void printValues(int[]) { /* ... */ } void printValues(int[10]) { /* ... */ }
虽然不能直接传递数组,但是函数的形参可以写成数组的形式。虽然形参表示方式不同,但可将使用数组语法定义的形参看作指向数组元素类型的指针。上面的三种定义是等价的,形参类型都是 int*。
编译器忽略为任何数组形参指定的长度。当编译器检查数组形参关联的实参时,它只会检查实参是不是指针、指针的类型和数组元素的类型时是否匹配,而不会检查数组的长度 和其他类型一样,数组形参可声明为数组的引用。如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组大小成为形参和实参类型的一部分。编译器检查数组的实参的大小与形参的大小是否匹配: // ok: parameter is a reference to an array; size of array is fixed void printValues(int (&arr)[10]) { /* ... */ } int main() { int i = 0, j[2] = {0, 1}; int k[10] = {0,1,2,3,4,5,6,7,8,9}; printValues(&i); // error: argument is not an array of 10 ints printValues(j); // error: argument is not an array of 10 ints printValues(k); // ok: argument is an array of 10 ints return 0; }
8
我们也可以用数组语法定义多维数组。与一维数组一样,编译器忽略第一维的长度,所以最好不要把它包括在形参表内:
// first parameter is an array whose elements are arrays of 10 ints void printValues(int matrix[][10], int rowSize);
declares matrix to be what looks like a two-dimensioned array. In fact, the parameter is a pointer to an element in an array of arrays. Each element in the array is itself an array of ten ints.
这条语句把 matrix 声明为二维数组的形式。实际上,形参是一个指针,指向数组的数组中的元素。数组中的每个元素本身就是含有 10 个 int 型对象的数组。
9
a是unsigned int
b也是unsigned int
a-b的结果肯定也是unsigned int ,unsigned int 的值不可能 <0,所以会出错
解决方法将结果强制转化成int,(int)(a-b)
10 静态全局变量不能被其他文件使用,但是非静态全局变量可以被其他文件使用。
11 静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员
12 函数名后加const表示此函数不能修改类成员
13 sprintf(path,"%d.txt",i);可以将数字和字符结合。