C++学习(complex类)

注意事项(class without pointer)

1、防卫式的申明,避免重复定义类
2、重载一般发生在构造函数中,构造函数可以提供默认实参,要注意成员初始化列表的使用。构造函数在对象创建的同时被调用。
3、有些函数可以在类中直接进行定义,也可以在类外进行定义,在类中进行定义的函数都为内联函数,在类外定义式在前面加上inline则也可以推荐为内联函数,但具体是不是内联还是得看编译系统。内联函数一般选择较为简单的函数(不能包含循环,switch等。)内联函数能够节省参数传递,控制转移等开销。
4、成员函数中分为会改变数据的函数和不会改变数据的函数,不会改变数据的函数立马加上const。
5、参数传递时如果通过传值的方式,一方面内容很大时会导致效率的降低,另一方面可能导致错误(不能修改调用函数中的数据对象)。参数传过去不希望对方进行修改则应该设置为const
6、返回值传递也尽量传引用,返回值不是一个local objects则可以传引用(this),注意<<重载与+=重载时的返回类型。
7、什么时候可以返回引用:不需要在函数内创建一个新的东西来返回出去,仅仅将计算后的值放在已经存在的东西上,如+=,但是相加则不行。返回的为一个local object则不能返回引用
8、所有的成员函数一定带有一个指向调用者的指针,全局函数没有this指针

代码展示

complex.h

#pragma once

#include 
using namespace std;

#ifndef _COMPLEX_
#define _COMPLEX_

//template//类模板
class complex
{
//访问级别:public、private(数据)、protected
public:
	//构造函数,默认实参,成员初始化列表
	//构造函数在对象创建的同时被调用,函数名称与类的名称相同
	//不带指针的类多半不用写析构函数
	//有可能将构造函数放在private中(singleton)单例模式
	complex(double r = 0, double i = 0)
		: re(r), im(i)
	{	}
	//inline函数
	//有些函数在此直接定义,有的函数去类外定义,若在类里面完成定义,便自动成为inline候选人
	//在类外定义时加上inline也可以成为inline函数的候选者
	//inline函数一般选择结构相对简单的函数,不能含有循环switch等。
	//编译时在调用处用函数体进行替换,节省了参数传递,控制转移等开销。

	//const
	//成员函数中分为会改变数据的函数与不会改变数据的函数
	//不会改变数据的函数立马加上const,如果没有添加const时,一旦用户定义对象时确定对象为const
	//就会产生类型不匹配的错误(用户定义为不能修改但是成员函数中默认可以更改,差生矛盾)
	double real() const { return re; }
	double imag() const { return im; }

	//参数传递
	//pass by value时如果内容很大时便会很慢,pass by reference相当于传指针,会很快。
	//参数传递尽量传引用,如果传过去不希望对方进行修改时则加const(pass by reference to const)
	
	//返回值传递
	//返回值传递也尽量return by reference
	complex& operator += (const complex&);

	//相同class的各个objects互为友元,c2能直接拿到c1的数据
	int func(const complex& param) const
	{
		return param.re + param.im;
	}
private:
	double re, im;

	//定义为友元能自由取得friend的private成员
	friend complex& __doapl(complex*, const complex&);
};

//什么时候可以返回引用:不需要在函数内创建一个新的东西来返回出去,仅仅将计算后的值放在已经存
//在的东西上,如+=,但是相加则不行。返回的为一个local object则不能返回引用
inline complex& __doapl(complex* ths, const complex& r)
{
	ths->re += r.re;
	ths->im += r.im;
	return *ths;
}

//所有的成员函数一定带有一个隐藏的参数this,this指向调用者
//全局函数没有this指针
//+=的返回类型不能是void(当使用者使用c1 += c2 += c3时会出现错误)
inline complex&
complex::operator += (const complex& r)
{
	return __doapl(this, r);
}

//对<<进行重载,便能使cout以想要的格式显示出复数
ostream&
operator << (ostream& os, const complex& x)
{
	return os << '(' << x.real() << ',' << x.imag()
			  << ')' << endl;
}
//typename()创建一个临时对象

#endif

complex.cpp

#include "complex.h"


int main()
{
	complex c1(2.5, 1.5);
	const complex c2(3.7,2.5);
	cout << c1.real() << ' ' << c2.imag() << endl;
	cout << c2.func(c1) << endl;
	c1 += c2;
	cout << c1.real() << endl;
	cout << c1;
	return 0;
}

你可能感兴趣的:(C++)