游戏开发第二站之C++(1)

  1. 防卫式声明:
    在一个头文件中,往往很少有人(小白初学者)编写头文件时加入防卫式声明,如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看情况

  1. 那么什么情况返回值可以使用引用呢?

如果是临时创建的值,则不能使用引用,如果我们进行引用了,因为该值是临时的,用完之后会消失,此时我们引用就无效了,如果创建的值它在内存中是有区域存放的,则可以进行引用

例子:

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)
{
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值