【博览网】面向对象高级编程(上)——第一周课程笔记

编程语言学习往往分为两个部分,一是该语言的语法特性,包括关键字、强类型还是弱类型、是否支持指针等等;二是该语言的标准库,包括提供的基本容器、输入输出方法等等。面向对象高级编程(上)这门课程主要是介绍第一部分的内容。

一、课程基本目标
1.以良好的方式编写C++ Class,包括以下两种类型
• 内部无指针的Class,以Complex为例
• 内部有指针的Class,以String为例
2.清楚Class之间的关系,包括以下三种
• 继承
• 复合
• 委托
3.推荐书目
《C++ primer》入门级的C++百科全书,介绍了C++最重要的特性
《Effective C++》进阶书籍,讲解如何写出高效的C++代码
《C++标准库》进阶书籍,讲解标准库的使用方法
《STL源码解析》解析STL的源代码实现,有助于读者了解C++标准库的底层内容

二、C++程序的基本结构
C++程序文件一般由3部分构成,一是头文件(.h文件),负责C++类的声明,二是资源文件(.cpp文件),负责C++函数的实现,三是标准库文件,为C++程序提供支持。在引入标准库或者自己编写的代码时,C++在与C兼容的同时,提供了一种新的引用方式,其代码如下所示:

#include <iostream.h> //C++标准库
#include "Date.h"  //程序中的其他头文件

C++程序与C语言程序最大的不同之处是引入了类(Class)的概念,Class与C语言中的Struct相似,是一种用户自定义类型,与Struct最大的不同在于,Class中可以存储函数,并且通过关键字实现封装功能,即:
Class = Datas + Functions

三、内部无指针的Class
以下内容是以一个简单的Class——Complex为例,介绍C++类的基本实现方式和需要注意的事项,部分较为简单的内容在此处省略了源代码。
1.Class基本形式

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;
    double im;
}


Complex& Complex::operator+=(const Complex& x)
{
    this->re += x.re;
    this->im += x.im;
    return *this;
}

2.inline函数
直接在类中间写的函数,以及在类外显式声明为inline的函数,会被认为是inline函数。inline函数是向编译器的一项建议,是否真正生成inline函数取决于具体的编译器。inline函数在调用时会被编译器直接将代码插入调用区的代码段,而不是通过程序跳转来实现相关调用。inline函数的优点是不需要跳转,因为调用速度比一般的函数快,但是由于是直接插入代码,因此生成的最终代码段会变长。因此inline函数适合比较短小的且会被频繁调用的函数。
3.访问权限
public:可以直接通过对象访问
private:不可以直接通过对象访问,也不可以在派生类中访问
protected:不可以直接通过对象访问,可以在派生类中访问
4.构造函数
在构造函数中,可以使用初值列为类中的数据对象赋值,其效率比在函数体中赋值效率要高。(主要是减少了参数拷贝的次数)
5.函数重载
C++支持函数重载,即相同函数名的函数可以有多个,只要其参数类型或者数量不一致即可。注意,只有返回值不同的函数是不可以重载的。
函数重载在C++中是通过编译时为函数加前缀进行唯一命名实现的。
6.const
const关键字是C++新增的关键字,其作用为将变量标记为不可更改变量。被const修饰的变量在其作用范围内是只读的,const关键字在防止函数或者变量误操作上有十分广泛的应用。const关键字也可以用来修饰类的成员函数,在修饰类的成员函数时表示该函数不会改变类内的数据的值。注意:类的常量对象智能调用类的常函数,即有const修饰的函数。因此,const关键字在类设计时是不可省略的。
7.传值or传引用
C++中增加了引用这一语法特性。引用可以看作是指向对象的一个指针,对其的操作与对被指向的对象直接进行操作是完全一致的。在函数中,传递引只是传递一个4字节的指针,而传递对象的值则需要将对象本身进行一次拷贝,因此效率会比传引用低。传递引用的语法格式如下所示:

Complex& operator+=(const Complex&);

由于在函数体内对引用对象的修改会同时影响到函数体外的对应对象,因此如果函数中对传入的引入对象没有修改,请加上const修饰词防止函数被误用。
8.返回值or返回引用
刚才说到传递引用效率会比传递值高,所以在传递返回值时是否也可以传递引用?这个需要看情况。如果返回的是函数内部创建的临时变量,那么只能返回值,因为临时变量在函数结束时会被销毁,引用面临空引用问题。如果返回的是从函数外部传入的引用变量或者指针,则可以使用引用返回。
9.友元
在类中使用friend关键字修饰的函数或者类是该类的友元,其语法如下所示:

friend Complex opertator+(Complex& x, Complex& y);
friend class f;

友元可以访问类中的任何成员而不受访问权限的限制,是一种灵活的语法形式。但是友元会破坏数据的封装性,因此需要谨慎使用。
10.操作符重载
操作符是一种特殊的函数,因此也是可以重载的。其重载方式有两种,一个是以成员函数的方式重载,一个是以友元函数的方式重载,示例如下:

Complex operator+(Complex& y)
{
    return Complex(this->re+y.re, this->im+y.re);
}
friend Complex operator+(Complex& x, Complex& y)
{
    return Complex(x.re+y.re, x.im+y.im);
}

注:同一类的所有对象互为友元。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值