一、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;};
private:
double 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;}
private:
double 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);