C++面向对象高级编程(一)

本文概述了C++与C的区别,介绍了头文件防卫式写法、模板类complex、内联函数、访问等级、构造函数、常量成员函数、参数传递、友元概念以及操作符重载,特别是通过实例展示了如何实现类的封装和运算符的自定义行为。
摘要由CSDN通过智能技术生成

本系列为根据侯捷老师系列课程所编写的笔记。

1.C与C++的区别
C:面向过程语言,将函数和数据分开存储,没有提供足够的关键字,数据是全局的,各个函数都可以处理他们。
C++:面向对象语言,将数据和处理数据的函数封装成一个类,以类为单位创建对象。

2.头文件的防卫式写法
可能有许多程序要用到头文件,此防卫式写法可做到不会重复include同一个头文件。

#ifndef __COMPLEX__
#define __COMPLEX__
//头文件本体
#endif

3.class的声明
在使用的时候再指定类型,可使用模版来实现。

template<typename T>
class complex //class head
{//class body
public:
	complex(T r = 0, T i = 0)
		: re(r), im(i)
	{}
	complex& operator += (const complex&);//声明
	T real() const {return re;}//定义
	T imag() const {return im;}//定义
private:
	T re, im;
	friend complex& __doapl(complex*, const complex&);
};

4.inline(内联)函数
在class内部定义完成的函数默认为inline函数,例如complex类中的构造函数和real()、imag()为inline函数。
函数是否真的是inline函数由编译器在编译时决定。

5.访问等级
public:所有人皆可访问
private:只有class内部才能访问
protected:只允许class内部及其子类访问

6.构造函数
构造函数在创建对象时会自动调用。
构造函数名称必须与类的名称相同,且可以有参数,该参数可有默认值。构造函数没有返回值类型,因为它的任务就是创建对象。
构造函数可以有初值列,可在初始化时就设定变量的初值,效率比赋值高。
构造函数可以有很多个——重载
把构造函数放入private区域
当创建对象时需要调用构造函数,但当构造函数为private时,外界就不可调用构造函数,即无法创建对象
用处:当该类不允许被外界创造对象,例如单例模式。

7.常量成员函数
在函数的参数列表后加const关键字,加在不会改变数据的函数后。
当函数使用const成员变量时,使用常量成员函数。

8.参数传递——pass by value vs pass by reference
pass by value:将数据整个传递
pass by reference:传递数据的引用,引用底层实现为指针,因此和传指针一样,在函数中修改变量会改变该变量在函数外的值。若是仅仅只需要该变量的值,可在形参前加const防止改变其值。
reference:传递着无需知道接受者是以reference形式接收。

complex& __doapl(complex* ths, const complex& r)
{
	ths->re += r.re;
	ths->im += r.im;
	return *ths;
}

9.友元friend
友元函数可自由取得friend中的private成员。
相同class的各个object互为友元,即一个class的两个对象可相互取得对方的private成员。

10.操作符重载

  1. 成员函数
    +=操作符作用在其左侧的变量上,若变量对+=有定义,则会调用+=的函数。
    所有函数成员函数都有一个隐藏的参数:this,this是一个指针,指向调用该函数的调用者。
complex& complex::operator += (const complex& r)
{
	return __doapl(this, r);
}
  1. 非成员函数
    非成员函数中没有this指针。
    为何不能返回reference?
    因为返回的必定是个local object,在函数结束后即销毁,若pass by reference则在函数结束后找不到该object。
inline complex 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));
}
inline complex operator + (double x, const complex& y)
{
	return complex(x + real(y), imag(y));
}
  1. 操作符重载<<
    因为可能需要连续输出,所以返回ostream;因为需要修改os,所以os不能设定为const。
#include<iostream>
ostream& operator << (ostream& os, const complex& x)
{
	return os << '(' << real(x) << ',' << imag(x) << ')';
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值