inline关键字

  • 类声明内定义的函数,自动成为inline函数,类声明外定义的函数,需要加上inline关键字才能成为inline函数

构造函数

应该使用列表初始化

class complex {
public:
complex(double r = 0, double i = 0) : re(r), im(i){} //列表初始化
private:
double re, im;
}; class complex {
public:
complex(double r = 0, double i = 0){ re = r; im = i; } //赋值构造函数
private:
double re, im;
};

列表初始化更快,是理想的初始化方式。

常量成员函数

如果函数内不改变成员函数的值,则可以加上const修饰,更加的保险。

class complex {
public:
...
double real() const { return re; }
double imag() const { return im; }
private:
double re, im;
};
  • 常量对象只能调用常量函数,上述成员函数如果不加const, 那complex类型的常量对象则不能调用。

参数的值传递和引用传递

应尽量使用参数的引用传递,避免了参数的复制且提高了效率。

返回值的值传递和引用传递

如果返回值是一个临时对象,那应该使用值传递,因为,一旦离开函数体,内部的临时对象就没了,相反,如果传回的对象是传入的对象的话,就使用引用传递,

ostream对象

对于重载的ostream对象,一般返回值的参数是ostream&, 不是void&, 因为我们输出的形式一般是cout<<t1<<t2, 连续输出, 返回ostream& 对象,可以继续输出。

友元

友元函数不属于对象函数,所以不受public,private,protected的限制, 但可以随意访问类内的所有成员和函数。

同一个类内的各个对象互为友元,所以在类定义中可以随意访问其他对象的私有成员, 如下:

class complex {
public:
....
int func(const complex& parm) {
return parm.re + parm.im;
}
private:
double re, im;
}; complex c1, c2;
c1.func(c2);

操作符重载

有两种方式实现操作符的重载:1. 在类内声明public类型的函数实现成员函数重载。2. 在类外声明全局函数重载。

类内声明的操作符重载 +=

在类内声明的操作符重载一般是作用在左操作数上的, 例如:

class complex {
public:
.....
friend complex& __dopal(complex*, const complex&);
complex& operator += (const complex& parm) {
return __dopal(this, parm);
}
private:
double re, im;
};
inline complex& __dopal(complex* ths, const complex& r) {
ths->re += r.re;
ths->im += r.im;
return *ths;
}
complex c1(1, 2);
c1 += 1; //重载 +=

对于类内重载的函数,其内隐含着一个this指针,可以像下面这样理解。

complex& operator += (complex* this, const complex& parm) {
return __dopal(this, parm);
}
  • 注意重载的操作符 += 其返回的参数类型为complex&, 是因为可能不止一个两个对象相加,可能多个连加: c1 += c2 += c3;
  • 注意不会改动的值或者对象尽量加 const 修饰。

在类外声明的操作符重载 +

类外声明的操作符重载,参数不局限于作用在左操作数,考虑左右操作数的不同形式,所以使用类外重载操作符。

complex c1(2,1);
complex c2; c2 = c1 + c2; // 用法1: complex + complex
c2 = c1 + 5; // 用法2: complex + double
c2 = 7 + c1; // 用法3: double + complex

在类外声明函数重载 <<

与重载+的考虑方法类似,<<操作符通常的使用方式是cout<<c1而非c1<<cout,因此不能使用成员函数重载<<运算符.

考虑到形如cout<<c1<<c2<<c3的级联用法,重载函数的返回值为ostream&而非void.

C++ 面向对象高级设计的更多相关文章

  1. 简学Python第七章__class面向对象高级用法与反射

    Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群  群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...

  2. oo面向对象--规格化设计

    oo面向对象--规格化设计 规格化设计与抽象 要了解规格化设计首先要了解抽象化的程序设计,两者是密不可分的. 抽象化(Abstraction) 抽象化是将数据与程序,用语义呈现他们的外观,但是隐藏起它 ...

  3. C++面向对象高级编程(七)point-like classes和function-like classes

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...

  4. C++面向对象高级编程(五)类与类之间的关系

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming   OOP面向对象编 ...

  5. Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)

    上节课复习:1.编程思想    面向过程        核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么        基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...

  6. Java第五次作业--面向对象高级特性(抽象类与接口)

    Java第五次作业--面向对象高级特性(抽象类与接口) (一)学习总结 1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结. 2.汽车租赁公司,出租汽车 ...

  7. Java第四次作业——面向对象高级特性(继承和多态)

    Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...

  8. Python第七章-面向对象高级

    面向对象高级 一. 特性 特性是指的property. property这个词的翻译一直都有问题, 很多人把它翻译为属性, 其实是不恰当和不准确的. 在这里翻译成特性是为了和属性区别开来. 属性是指的 ...

  9. python高级之面向对象高级

    python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(pu ...

随机推荐

  1. linux的0,1,2号进程

    一.答案 https://blog.csdn.net/gatieme/article/details/51532804 仔细读一下作者的博客,都是操作系统底层相关. 二.补充: 1.linux代码,a ...

  2. 企业安全_DNS流量监控的技术选型

    方案1 Windows server n ---> packbeat ---> logstash ---> kafka | ┗ ---------> elasticsearch ...

  3. 六. SpringCloud网关

    1. Gateway概述 1.1 Gateway是什么 服务网关还可以用Zuul网关,但是Zuul网关由于一些维护问题,所以这里我们学习Gateway网关,SpringCloud全家桶里有个很重要的组 ...

  4. 【转载】Android的事件分发(dispatchTouchEvent),拦截(onInterceptTouchEvent)与处理(onTouchEvent)

    出处:https://blog.csdn.net/caifengyao/article/details/65437695 在Android中,View的结构是树状的,所以,当触发触摸事件的时候,其事件 ...

  5. 翻译:《实用的Python编程》04_03_Special_methods

    目录 | 上一节 (4.2 继承) | 下一节 (4.4 异常) 4.3 特殊方法 可以通过特殊方法(或者称为"魔术"方法(magic method))自定义 Python 行为的 ...

  6. Mybatis最权威的知识点

    1.什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement ...

  7. Django之cookie 与session组件

    一.会话跟踪技术 1.1 什么是会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...

  8. MySQL优化从执行计划开始(explain超详细)

    前言 小伙伴一定遇到过这样反馈:这页面加载数据太慢啦,甚至有的超时了,用户体验极差,需要赶紧优化: 反馈等同于投诉啊,多有几次,估计领导要找你谈话啦. 于是不得不停下手里头的活,赶紧进行排查,最终可能 ...

  9. C语言之漫谈指针(下)

    C语言之漫谈指针(下) 在上节我们讲到了一些关于指针的基础知识: 详见:C语言之漫谈指针(上) 本节大纲: 零.小tips 一.字符指针 二.指针数组与数组指针 三.数组传参与指针传参 四.函数指针及 ...

  10. Spring源码之注解扫描Component-scan

    本文主要介绍Spring的component-scan标签,了解spring是如何实现扫描注解进行bean的注册,主要实现实在 NamespaceHandler, NamespaceHandlerSu ...