1.哪些类需要自己定义构造函数?
含有内置类型或者符合类型成员的类,通常应该定义自己的默认构造函数初始化这些成员。
对于具有类类型的成员,编译器创建的默认构造函数会调用类类型成员所属类自身的默认构造函数实现该成员变量的初始化。
对于具有内置类型的成员,编译器创建的默认构造函数会1.如果对象(类对象)定义在全局作用域(函数外)或者是静态局部对象,则内置类型(类成员变量)初始化为0
2.如果对象定义在局部作用域中,则内置类型未进行初始化。
2.重载函数,同一个函数名,根据形参表(区别重载函数的唯一标准,返回值不用于区别重载函数)的不同,编译器调用不同的函数实现。
bool lookup(const account&);
Record lookup(const account&);//只有返回值不同,该函数定义是error的
//下面的函数不是重载函数而是同一个函数
Record lookup(phone);
Record lookup(const phone);//值传递,复制形参时不考虑是否为const,函数操作的只是副本,函数无法修改实参。
有const引用形参,有非const引用形参的函数
有指向const类型的指针形参,有指向相同类型非const对象的指针则属于函数的重载。
Record lookup(const phone&, const name&);
Record lookup(const phone&, const name& = " ");//默认实参并没有改变形参的个数,所以属于函数的重复定义
2.1局部声明的函数会屏蔽而不是重载外层作用域中声明的同名函数(所以要求重载函数都生命在同一作用域中,如果声明在头文件中)
void print(const string &);
void print(double);//overloads,print函数的重载
void foodBar()
{
void print(int);//函数的声明,屏蔽了外部的print
print("value");//error,因为void print(const string &);被屏蔽了,这里调用的是void print(int);明显实参和形参不匹配,出现error
print(3.14);//ok,但是调用的void print(int),值传递时候隐式转换,实际为print(3);,void print(double);被屏蔽了
}
3.带默认形参的函数(一般是在声明的时候指定默认形参)
bool adsCheckIsSmallRect(adsRect& rect, adsInt & getSP = 0); //error, 因为adsInt & getSP = 0, 左边是adsInt &, 而右边是adsInt, 相当于是引用的
//初始化问题,引用的右值应该是一个变量
带默认值的意思是表示,调用的时候可以不给形参赋实参,而去用默认的实参值。但是在函数声明的时候必须还是要写全所有的形参列表。
默认值的指定可以在函数定义或者声明的时候指定一次。
void fun(int *p = NULL) //带默认实参
{
int q=50;
*p=q; //p所指的内存为空,不能访问一个空的内存,“段错误”
}
如果要按上面的方法来的话(利用指针形参返回局部变量+带默认实参)可以加个if条件
void fun(int *p = NULL)
{
int q=50;
if(p)
*p=q;
}
这样在调用的时候,如果直接调用fun();(有可能会报错,因为不知道调用的是void fun(void),还是void fun(int *p =NULL))则表明不返回局部变量值
如果调用的是int temp = 0; fun(&temp); 则可以通过temp返回局部变量值q。