头文件和类声明
一定要注意使用防卫式的头文件声明:
#ifndef _CLASSHEAD_
#define _CLASSHEAD_
.
.
.
.
#endif
基于对象和面向对象 :
基于对象 单一Class
面向对象 多个class 之间的关系.
构造函数
inline
默认实参
initialization list 初始列 (在初始列中进行,效率更高)
构造函数重载 overloading
class complex
{
complex (double r =0, double i = 0)
: re (r) , im (i)
{}
complex()
: re(0) , im(0)
{}
private:
double re, im;
};
第二个构造函数是错误的, 因为第一组构造函数已经有初始默认值了,那么第二个就重复设定了.
例如创建对象:
complex c1;
complex c2();
此时就发现,无论是使用第一个构造函数还是第二个构造函数,都是可行的.
所以,第二个构造函数是错的.
当然我们还可以构建其他方式的构造函数.
参数传递与返回值
将构造函数放在private中.
Singleton设计模式
使得本类只有一份实例对象.
在函数后面加const是个好习惯,用于说明该函数内不改变数据
参数传递: pass by value VS pass by reference ( to const)
尽量不要pass by value
传引用其实底层就是传指针.
传引用是4字节, 如果传递是一个字符(单字节) 那还是单字节速度快一些.
传递引用为了控制安全尽量使用const关键字.
如果传递的参数使用reference但并不声明const的,那么也是会被在函数内修改的.
返回值传递: pass by value VS pass by reference ( to const)
尽量return by reference
什么时候不适用reference
1, 当该返回的参数是在函数内定义的局部变量
什么时候适用reference
其他情况全适用
操作符重载与临时对象
—-1 成员函数
+= 双目操作符调用的时候,是调用操作符左边的对象.
return by reference 语法分析
传递者无需知道接收者是以reference形式接收的
(这句话似乎很难吃透, 很值得深刻理解并记住)
—- 2 非成员函数
操作符重载也有可能是全局函数,不一定是类里面的成员函数
你无法同时在类内定义操作符重载又在全局中定义该类的同一个操作符重载
在cout<< …..这样的情况下操作符重载只能是全局操作. 因为左边为ostream的对象os
重载示例:
//实现:
ostream& operator << (ostream& os , const MyClass& my)
{
return os<<my.name<<my.address;
}
//在调用上:
cout<<my;
/*
当只是为了 cout<< c1; 这样的操作, 那么函数可以这样写:
void operator << (ostream& os, const complex& x);
但为了多次操作: cout<<c1<<cout<<c2;那么久必须这样写:
ostream& operator << (ostream& os, const complex& x);
*/
总结:
大气代码:
**1,数据放在private里.
2, 数据传递尽量reference.
3, 数据返回也尽量是reference.
4, 类body中尽量使用const.
5, 构造函数尽量使用初始列
6,操作符重载也有可能是全局函数,不一定是类里面的成员函数**