- 防卫式声明:
在一个头文件中,往往很少有人(小白初学者)编写头文件时加入防卫式声明,如complex.h
complex.h
#ifndef _COMPLEX_
#define _COMPLEX_
~~~~~~~~~~~~~~~~~~~~
//头文件主体
~~~~~~~~~~~~~~~~~~~~
#endif
在预编译阶段,编译器会把.h文件展开。防卫式声明的作用是:防止由于同一个头文件被包含多次,而导致了重复定义。
参考:防卫式声明
函数若在class body内定义则是inline候选人,意思是不一定是inline函数,有些函数编译器没有能力让它变为inline函数,
不在本体内定义 用inline关键字定义则为inline函数
构造函数初始化的两种写法:
第一种:
class complex
{
public:
complex(double r=0,double i = 0) //构造函数
:re(r),im(i)
{}
}
第二种:
class complex
{
public:
complex(double r=0,double i = 0) //构造函数
{
re = r;
im = i;
}
}
我们要尽量使用第一种方式,这样能够提高效率,编译器初始化的时候会“ 早一点 ”进行
注意:
不带指针的类多半不用析构函数
函数重载常常发生在构造函数上
相同class的各个objects互为friend
传值和返回值可以尽量使用引用提高效率,能不能加const看情况
- 那么什么情况返回值可以使用引用呢?
如果是临时创建的值,则不能使用引用,如果我们进行引用了,因为该值是临时的,用完之后会消失,此时我们引用就无效了,如果创建的值它在内存中是有区域存放的,则可以进行引用
例子:
inline complex& _doapl(complex* ths,const complex& r)
{
ths->re += r.re;
ths->im += r.im;
return *ths;
}
上面的 *ths 不是临时变量,因此可以返回引用,返回的值为 *ths,*ths可以被改动。但r不会被改动。
运算符重载于临时对象
任何成员函数都有一个隐藏的this point
传递者无需知道接收者是以什么形式接收,可以以reference形式接收也可以以value形式接收
inline complex&
_doapl(comples *ths,const complex& r)
{
...
return *ths;
}
上面的代码返回的是一个*ths (value值)接收是以**引用(complex&)**的形式接收的。
当使用者连串使用赋值操作时,返回类型应避免使用void类型
inline complex&
complex::operator +=(const complex& r)
{
return _doapl(this ,r);
}
如果使用如下代码
complex c1(2,1)
complex c2(5);
c2+=c1;
那么return _doapl(this ,r);
的返回类型可以为void
如果使用代码是:
complex c1(2,1)
complex c2(5);
c3+=c2+=c1;
return _doapl(this ,r);
的返回类型应该为complex&
c2进行赋值操作完毕之后要返回参数给c3用,因此不可以是void
下面函数绝不可return by reference 因为它们返回的是一个local object ,临时在函数内创建一个对象进行存放,离开了函数就死亡了,要体会 加 和 加到两者之间的区别,一个对象加到另一对象上可以以引用接收,两个对象进行加操作没有放置到某对象上,因此不可以用引用接收
inline complex
operator + (const complex& x,const complex &y
{
return complex(real(x)+real(y),imag(x)+imag(y));
}
typename();创建一个临时对象,这里complex(real(x)+real(y),imag(x)+imag(y));
complex()临时创建一个对象存放其中的值
类似的如int(7);
complex();//第一行
complex(4,5);//第二行
//第三行,上面两行创建的临时对象,到第三行就已经死亡了
cout是一个对象 它的typename是ostream
cout<<c1;
的意义是操作符(可以认为是一种函数)<<
作用于cout
的这个对象,将cout
传入重载函数里面去 课程里面是os
引用了cout
这个对象:
#include<iostream.h>
ostream& << (ostream& os,const comples& x)
{
}