C++之不带指针类的设计——Boolean
经典的类设计分类
- 带指针类
- 不带指针类
Header文件的布局
#ifndef __COMPLEX__
#define __COMPLEX__
#include <iostream.h>
class complex //前置申明
class complex
{
...//类声明
}
complex::function()...//类定义
#endif
类声明
class complex //class head
{ //class body
public:
complex (double r = 0, double i = 0): re (r), im (i) { }
complex& operator += (const complex&);
double real () const { return re; } //函数在body内定义,则自动成为inline候选人
double imag () const { return im; }
private:
double re, im;
friend complex& __doapl (complex *, const complex&);
};
构造函数
构造函数是类中非常重要的函数,在类创建的时候由系统自动调用
complex (double r = 0, double i = 0)//默认参数,在不传参的时候直接使用默认值
: re (r), im (i) //初始值列表,在创建成员的时候直接赋值,比在创建之后赋值效率高
{ }
- 构造函数可重载:重载的时候注意是否有默认参数
- 构造函数可以是private :private的时候不允许外部创建对象,这个是在singleton的时候经常用到。
常量成员函数
double real () const { return re; }
在函数名后面加const修饰符,一般情况下加const表示这个函数不会修改内部的成员变量。能加的尽量加上const。
const complex a(1,2);//由于a是const的,而类的设计者在设计real()的时候没有const,调用会报错
a.real();
参数传递和返回值传递
- 传值
- 传引用
值传递会发生拷贝,当传递比较大的数据时,拷贝是一件很费时间和效率的事情,所以在传值和引用之间首选传引用,但是需要考虑有些时候是不能传引用的,比如临时对象
friend(友元)
自由取得friend的private成员
相同class的各个object互为友元
操作符重载
操作符重载可以看做是特殊的函数,可以是成员函数,也可以是非成员函数,如果是成员函数的话,默认第一个参数是this指针,一般不写。
![](http://images2015.cnblogs.com/blog/19200/201702/19200-20170209222425166-1415087702.png)
这种情况下就不能写成是成员函数了,因为和其它类型的对象相加
![](http://images2015.cnblogs.com/blog/19200/201702/19200-20170209222435807-1040259625.png)
这种情况下,返回的是临时对象,临时对象返回值绝对是不能用引用的
重点回顾:
- 数据Data一定放在“class body”的pirvate中
- 参数parameters尽可能使用 pass by reference 方式传递
- 返回值return value 尽量用 pass by reference 来传递
- class的body主体内不做变更的参数 或 返回值 应该 const 标识符,表示不希望被修改
- 构造函数中有一个 initialization list,要尽量去使用。与在构造函数体内部进行参数初始化赋初值效率更高
返回值在什么情况下,不能使用pass by reference?
如果函数的返回值是在函数体内部临时创建用来存放结果值(是local的),那么在函数结束时这个临时对象的生命周期就结束了【虽然仍然可以吧reference传递出来但是是错误的】。这种情况则不能使用pass by reference。
C++之不带指针类的设计——Boolean的更多相关文章
- [c++] 面向对象课程(二)-- 带指针类的设计
class with pointer menbers string_test.cpp 1 #include "string.h" 2 #include <iostream&g ...
- Boost源码剖析之:泛型指针类any
C++是强类型语言,所有强类型语言对型别的要求都是苛刻的,型别一有不合编译器就会抱怨说不能将某某型别转换为某某型别,当然如果在型别之间提供了转换操作符或是标准所允许的一定程度的隐式转换(如经过非exp ...
- “乐”动人心--2017年10款最佳音乐类APP设计盘点
在上下班的路上,听几首自己喜欢的音乐来打发无聊的等公交车和地铁的时间是现代年轻人的常态.音乐作为最能鼓动人心的"语言",也成为了人们在互联网生活里占比例最高的消费活动之一,一款好看 ...
- 仿boost::any的泛型指针类any的实现
在boost库中,any是一种特殊容器,只能容纳一个元素,但这个元素可以是任意的类型----int.double.string.标准容器或者任何自定义类型.程序可以用any保存任意的数据,也可以在任何 ...
- 4.3.6 对象的界定通过编写接口来访问带这类命名结构的表会出问题。如前所述,SQL Server的灵活性不应用作编写错误代码或创建问题对象的借口。 注意在使用Management Studio的脚本工具时,SQL Server会界定所有的对象。这不是因为这么做是必须的,也不是编写代码的最佳方式,而是因为在界定符中封装所有的对象,比编写脚本引擎来查找需要界定的对象更容易。
如前所述,在创建对象时,最好避免使用内嵌的空格或保留字作为对象名,但设计人员可能并没有遵守这个最佳实践原则.例如,我当前使用的数据库中有一个审核表名为Transaction,但是Transaction ...
- C++中的智能指针类模板
1,智能指针本质上是一个对象,这个对象可以像原生的指针一样使用,因为智能指 针相关的类通过重载的技术将指针相关的操作符都进行了重载,所以智能指针对象可以像原生指针一样操作,今天学习智能指针类模板,通过 ...
- Unity3D 游戏开发构架篇 ——角色类的设计与持久化
在游戏开发中,游戏角色占了很大的篇幅,可以说游戏中所有的内容都是由主角所带动.这里就介绍一下角色类的设计和持久化. 一.角色类应用场景和设计思想 游戏中的角色类型不一而足,有不同的技能,有不同的属性等 ...
- sp<> 强指针类的用法
在android 中可以广泛看到的template<typename T>, class Sp 句柄类实际上是android 为实现垃圾回收机制的智能指针.智能指针是c++ 中的一个概念 ...
- AC自动机总结及板子(不带指针)
蒟蒻最近想学个AC自动机简直被网上的板子搞疯了,随便点开一个都是带指针的,然而平时用到指针的时候并不多,看到这些代码也完全是看不懂的状态.只好在大概理解后自己脑补(yy)了一下AC自动机的代码,居然还 ...
随机推荐
- redis mac安装配置
去官网下载redis. 解压后 终端cd 至目标文件夹 编译测试: sudo make test 编译安装: sudo make install 输入redis-server启动服务 停止 redis ...
- C++_类入门2-使用类
进一步探讨类的特征,重点是类设计技术,而不是通用原理.一些特性很容易,一些特性很微妙. 运算符重载 目的是使C++操作更美观,更接近于内置类型的操作. 隐藏了内部的实现机理,并强调了实质. 格式:op ...
- Wannafly挑战赛26-F. msc的棋盘(模型转化+dp)及一类特殊的网络流问题
题目链接 https://www.nowcoder.com/acm/contest/212/F 题解 我们先考虑如果已知了数组 \(\{a_i\}\) 和 \(\{b_i\}\),如何判断其是否合法. ...
- P3243 [HNOI2015]菜肴制作
传送门 把时间看成数,菜肴看成位置 考虑一个位置填什么数很麻烦 考虑一个数放在什么位置 一开始我想的是,对于一个限制 $(a,b)$ ,从 $a$ 往 $b$ 连一条边,然后如果有解则所有的限制构成了 ...
- BZOJ - 1941 最远估价
题意:求给出的所有点的最远点减最近点的最小差值 KD树的最远估价和最近估价略微不同,直接找最远垂线,反正xjb改一下就过了 #include<bits/stdc++.h> #define ...
- WAMP下Apache配置Vhost (2
发布网站添加虚拟机"/usr/local/apache/conf/extra/httpd-vhost.conf"的最下面: <VirtualHost *:80> Ser ...
- docker 启动容器报错
2018-10-24 报错信息: /usr/bin/docker-current: Error response from daemon: driver failed programming exte ...
- 打ms15-034补丁出现“此更新 不适用于您的计算机”
1.MS15-034漏洞的补丁是KB3042553; 2.如果在一台Windows Server 2012 R2的服务器上直接安装补丁文件KB3042553,可能会出现“此更新 不适用于您的计算机”的 ...
- PHP foreach ($arr as &$value)
foreach ($arr as &$value) 看到一个有意思的东西: <?php $arr = ['1', '2', '3', '4']; foreach ($arr as &am ...
- Vue如何封装多个全局过滤器到一个文件
#### 在写vue项目时,所用的过滤器很多时,把所有的过滤器方法封装在一个文件中,然后导出,并绑定在vue实例上 1.在src下创建filters文件夹,并新建index.js文件 2. index ...