侯捷c++课程学习一

一、C++编程简介

c with class

二、头文件与类的声明

c++的struct几乎等同于class

  • 字符串string里面其实只有一个指针,指向一串字符

1、 区分class分类

  • 【object based 基于对象】面对的是单一class的设计。不带指针(pointer members),eg.复数
  • 【object oriented 面向对象】面对的是多重classes的设计,classes和classes之间的关系。带指针 eg.字符串

2、头文件

  • 标准库:#include<>
    自己写的头文件 #include “”
  • 防卫式声明(使得include多个文件时不需要管次序)
#ifndef _COMPLEX_
#define _COMPLEX_
...
#endif

3、class的声明
4、inline函数
函数若在class body内定义完成,便自动成为inline候选人

三、构造函数

想创建一个对象,有一个函数会自动调用。函数名跟类名相同

  • 实参可有默认值
  • 没有返回类型,因为它要创建的就是这个类的这种东西。
  • 只有构造函数有:初始列 initialization list
class complex{
public:
	complex(double r=0, double i = 0): re(r), im(i) 
	{} //写在大括号里面叫赋值,不叫初始化
	complex& operator += (const complex&);
	double real() const {return re;};
	double imag() const {return im;};
privatedouble re, im;
	friend complex& _doapl (complex*, const complex&);

1、构造函数可以有很多个–overloading重载
eg.void real(double r ) {re = r; } //其实在实际编译后底层机器上两个函数的名字不一样,不同名
2、构造函数重载时注意不要冲突,即避免创建对象时不知道调用哪个。

四、参数传递与返回值

1、const member functions
函数名后面加const, 该函数不会改变数据,比如打印数据,只是拿数据

eg: 前面加const,说明该对象内容不可改变
( const对象只能使用const函数)

{
	const complex c1(2,1);//前面加const,说明该复数对象内容不可改变
	cout<< c1.real;
	cout<< c1.imag;
}

2、参数传递
=======所有参数最好传引用。

  • 传值(栈):value多大,整包传过去,比如100个字节全部传过去
  • 传引用 :(底部就是一个指针,传引用就相当于传指针那么快)传地址过去
  • 我希望传引用但又不打算让你改,加const complex& operator += (const complex&);

3、返回值传值:也尽量传引用reference
函数内新声明的局部变量不能用引用传出去,因为函数一结束局部变量会销毁。

 complex& operator += (const complex&);//前面就是说明return by reference

4、友元
三中的函数 _doapl 自由取得friend的私有成员

  • 同一个class创建出来的各个objects互为friends
class complex{
public:
	complex(double r=0, double i = 0): re(r), im(i) 
	{} //写在大括号里面叫赋值,不叫初始化
	int func(const complex& param){
	return param.re + param.im;}
privatedouble re, im;
};
	

五、操作符重载与临时对象

1、operator overloading_1(成员函数, this)

{
	complex c1(2,1);
	complex c2(5);

	c2 += c1;//操作符作用在左边c2
}

+= 的重载实现:

inline complex&  //接收端,以reference形式接收,速度快
_doapl(complex* ths, const complex& r)//do assignment plus赋值加
{
	ths->re += r.re;
	ths->re += r.re;
	return *ths; //返回端,一个value
}

inline complex& //返回类型不可以是void,因为情形c3+= c2 += c1
complex::operator += (this, const complex& r)//this是隐藏的,不能写出来
{
	return _doapl(this, r);
}
  • 所有成员函数一定带有一个隐藏的参数this, 即其实没有写,但是它在
  • 谁调用这个函数,谁就是this(调用者),此处为c2, 所以编译器会把c2地址传入,当成this指针。
  • 传递者无需知道接收者是以reference形式接收

2、operator overloading_2(非成员函数, 无this)
全局函数

inline complex /--return by value--/
operator + (const complex& x, const complex& y){
	return complex(real(x) + real(y),
				   imag(x) + imag(y));
}

inline complex 
operator + (const complex& x, double y){
	return complex(real(x) + y, imag(x));
}
  • 绝不可以return by reference,因为返回的必定是个local object,因为把左边和右边相加,加的哪个东西能放在哪里,目前没有这个东西(_1是把右边加到左边,左边已经存在)
  • 因为创建的局部返回,不可能返回出去reference,因为一离开函数就死掉了

3、 创建temp object(临时对象)
typename () // 临时才要的,没有名称,生命到下一行就结束了
eg.return complex(real(x) + y, imag(x));

complex();//临时对象,没有参数,用默认值
complex(4,5);

六、复习Complex类的实现过程

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值