1. 类型转换:
1)double -> int
double v1 = 3.14;
int v2 = v1;
warning C4244: “初始化“: 从double转换到int 可能会产生数据丢失。//原来会报错吧???
2)int -> double
int v1 = 3;
double v2 = v1;
通过。
2. 如果函数形参的数据类型很大,最好使用该类型的引用
3. 非 const 引用形参只能与完全同类型的非 const 对象关联。
int incr(int &val)
{
return ++val;
}
int main()
{
short v1 = 0;
const int v2 = 42;
int v3 = incr(v1); // error: v1 is not an int
v3 = incr(v2); // error: v2 is const
v3 = incr(0); // error: literals are not lvalues
v3 = incr(v1 + v2); // error: addition doesn't yield an lvalue
int v4 = incr(v3); // ok: v3 is a non const object type int
}
4. 1)数组有两个特殊的性质:一是不能复制数组;二是使用数组名字时,数组名会自动转化为指向其第一个元素的指针。因为数组不能复制,所以无法编写使用数组类型形参的函数。因为数组会被自动转化为指针,所以处理数组的函数通常通过操纵指向数组指向数组中的元素的指针来处理数组。
2)数组形参的定义(三种等价)
void printValues(int*) { /* ... */ }
void printValues(int[]) { /* ... */ }
void printValues(int[10]) { /* ... */ }//限制数组长度,当传递比这个长度小的实参时,为合法。
5. 通过引用传递数组
注:编译器会检查数组大小和类型是否匹配。
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;
}
6. 多维数组的传递
第一维长度可以不确定,matrix 声明为指向含有 10 个 int 型元素的数组的指针。
void printValues(int (*matrix)[10], int rowSize);
void printValues(int matrix[][10], int rowSize);
7. main的返回值类型不是void时,函数体内也可以没有return语句,其它函数不可以。
8. 当函数返回值是非引用类型的话,与用实参初始化形参的方法是一样的,在调用函数的地方会将函数返回值复制给临时对象。
9. 千万不要返回局部对象的引用。当函数执行完毕时,将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。
10.一个函数只能定义一次,但是可声明多次。
11.程序员可为一个或多个形参定义默认值。但是,如果有一个形参具有默认实参,那么,它后面所有的形参都必须有默认实参。调用包含默认实参的函数时,可以为该形参提供实参,也可以不提供。如果提供了实参,则它将覆盖默认的实参值;否则,函数将使用默认实参值。指定默认实参的约束。既可以在函数声明也可以在函数定义中指定默认实参。但是,在一个文件中,只能为一个形参指定默认实参一次。
12.inline 函数避免函数调用的开销。将函数指定为 inline 函数,(通常)就是将它在程序中每个调用点上“内联地”展开。假设我们将 shorterString 定义为内联函数,则调用:cout << shorterString(s1, s2) << endl; 在编译时将展开为:cout << (s1.size() < s2.size() ? s1 : s2)<<endl; inline函数应该在头文件中定义,这与其它函数不同。
13.编译器隐式地将在类内定义的成员函数当作内联函数。
14.const 成员函数的引入。
bool same_isbn(const Sales_item &rhs) const{… …}
用这种方式使用 const 的函数称为常量成员函数。由于 this 是指向 const 对象的指针,const 成员函数不能修改调用该函数的对象。
15.构造函数和初始化列表。在冒号和花括号之间的代码称为构造函数的初始化列表。
Sales_item(): units_sold(0), revenue(0.0) { }
16.出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数。注:任何程序都仅有一个 main 函数的实例。main 函数不能重载。
17.在实际应用中,调用重载函数时应尽量避免对实参做强制类型转换:需要使用强制类型转换意味着所设计的形参集合不合理。
18.指向函数的指针。
bool (*pf)(const string &, const string &);
这个语句将 pf 声明为指向函数的指针,它所指向的函数带有两个 const string& 类型的形参和 bool 类型的返回值。
在引用函数名但又没有调用该函数时,函数名将被自动解释为指向函数的指针。函数指针只能通过同类型的函数或函数指针或 0 值常量表达式进行初始化或赋值
19.返回指向函数的指针。
typedef int (*PF)(int*, int);
PF ff(int); // ff returns a pointer to function
int (*ff(int))(int*, int);
将 ff 声明为一个函数,它带有一个 int 型的形参。该函数返回int (*)(int*, int); 它是一个指向函数的指针,所指向的函数返回 int 型并带有两个分别是 int* 型和 int 型的形参。