29、类中的属性默认是private(与java不同)
30、构造函数要注意:
ClassA a = ClassA(1,3);
与 ClassA a; a = ClassA(1,3); 不同。
第一种方式是初始化,而第二种是赋值。初始化他创建有指定值的对象;可能会创建临时对象,也可能不会。 而赋值一定会创建一个临时对象。
31、const成员函数:
const ClassA a = Class(1,3);
a.show();//这种将不被允许。因为不知道show()是否改变对象
为了解决这个问题:
函数声明:
ClassA{
...
public:
void show() const;
...
}
函数定义:
void ClassA::show()const;
我们要尽量遵守这一规则:只要类方法不修改调用对象,就应该声明为const。 (就如同const 作为函数参数一样)
32、进一步理解引用的作用。
引用必须被初始化,同时会和一直指向提供初始化时的变量。
引用作为参数
33、操作符重载,有一些限制,不能改变原操作符的优先级,操作数个数。有些操作符不能从在 比如::,.,sizeof等
34、友元函数是非成员函数,但是访问权限和成员函数相同。
在类中声明,加上friend 修饰。 定义时不加friend。其中左操作符是对象本身。
友元函数多用于操作符的重载。
比如 cout << 中的<<操作符重载(其实<<的原型操作符是位左移)
class c_name
{
...
public :
friend ostream & operator<<(ostream & os,const c_name & obj);
....
}
ostream & operator<<(ostream & os,const c_name & obj)
{
os << obj. .....
}
35、explicit 关键字修饰 构造函数,禁止隐式强制类型转换。
class ca{
int a;
public :
explict ca (int va){a = va;}
}
..
ca v_ca;
v_ca = 4;//不允许(如果构造函数没有 explict 是可以的)
v_ca = ca(4);//当然可以
v_ca = (ca) 4; //也是可以的,经典的强制类型转换方式
36、类型转换函数(java里可没有啊...)
声明: operator typeName(); //typeName转换成什么类型 ,比如int ,double...
转换函数必须是类方法
转换函数不能指定返回类型
转换函数不能有参数
当作类型转换的时候,避免二义性。 尽量避免隐式类型转换...:)
37、复制构造函数
原型:ClassName (const ClassName &);
下面四种情况会调用:
ClassName cn(1,2);ClassName ccn = cn;
ClassName ccn(cn);
ClassName ccn = ClassName(cn);
ClassName *ccnp = new ClassName(cn);
这里需要重点分析一下...
38、继承,基类首先被创建;派生类构造函数应通过成员初始化列表将基类信息传递给基类的构造函数;派生类构造函数应该初始化新增成员。
39、方法的重写:
如果要在派生类重新定义基类的方法。通常基类声明是visual的,这样程序会根据对象的实际类型而不是引用和指针类型来选择方法版本。 派生类重写了基类的visual方法后,自身自动为visual,一般的显式写上visual,不失为一个好方法。为基类声明一个虚拟构造函数也是一种惯例。
未完待续....
30、构造函数要注意:
ClassA a = ClassA(1,3);
与 ClassA a; a = ClassA(1,3); 不同。
第一种方式是初始化,而第二种是赋值。初始化他创建有指定值的对象;可能会创建临时对象,也可能不会。 而赋值一定会创建一个临时对象。
31、const成员函数:
const ClassA a = Class(1,3);
a.show();//这种将不被允许。因为不知道show()是否改变对象
为了解决这个问题:
函数声明:
ClassA{
...
public:
void show() const;
...
}
函数定义:
void ClassA::show()const;
我们要尽量遵守这一规则:只要类方法不修改调用对象,就应该声明为const。 (就如同const 作为函数参数一样)
32、进一步理解引用的作用。
引用必须被初始化,同时会和一直指向提供初始化时的变量。
引用作为参数
33、操作符重载,有一些限制,不能改变原操作符的优先级,操作数个数。有些操作符不能从在 比如::,.,sizeof等
34、友元函数是非成员函数,但是访问权限和成员函数相同。
在类中声明,加上friend 修饰。 定义时不加friend。其中左操作符是对象本身。
友元函数多用于操作符的重载。
比如 cout << 中的<<操作符重载(其实<<的原型操作符是位左移)
class c_name
{
...
public :
friend ostream & operator<<(ostream & os,const c_name & obj);
....
}
ostream & operator<<(ostream & os,const c_name & obj)
{
os << obj. .....
}
35、explicit 关键字修饰 构造函数,禁止隐式强制类型转换。
class ca{
int a;
public :
explict ca (int va){a = va;}
}
..
ca v_ca;
v_ca = 4;//不允许(如果构造函数没有 explict 是可以的)
v_ca = ca(4);//当然可以
v_ca = (ca) 4; //也是可以的,经典的强制类型转换方式
36、类型转换函数(java里可没有啊...)
声明: operator typeName(); //typeName转换成什么类型 ,比如int ,double...
转换函数必须是类方法
转换函数不能指定返回类型
转换函数不能有参数
当作类型转换的时候,避免二义性。 尽量避免隐式类型转换...:)
37、复制构造函数
原型:ClassName (const ClassName &);
下面四种情况会调用:
ClassName cn(1,2);ClassName ccn = cn;
ClassName ccn(cn);
ClassName ccn = ClassName(cn);
ClassName *ccnp = new ClassName(cn);
这里需要重点分析一下...
38、继承,基类首先被创建;派生类构造函数应通过成员初始化列表将基类信息传递给基类的构造函数;派生类构造函数应该初始化新增成员。
39、方法的重写:
如果要在派生类重新定义基类的方法。通常基类声明是visual的,这样程序会根据对象的实际类型而不是引用和指针类型来选择方法版本。 派生类重写了基类的visual方法后,自身自动为visual,一般的显式写上visual,不失为一个好方法。为基类声明一个虚拟构造函数也是一种惯例。
未完待续....