Effective C++ 随笔(4)

条款21:必须返回对象时,别妄想返回其reference

例子:

Raional类可以执行有理数的一些运算,并且使用heap内存申请 并且其operator*函数为

const Rational& operator*(const Rational& lhs,const Rational& rhs){
	Ratinal* result = new Rational(.....);
	return * result;
}

在函数中进行了heap内存申请,因此返回引用时没有问题的,但是问题在于下面

Rational w,x,y,z;
w=x*y*z;
即 w = x*(y*z)

返回的指针无法获得,从而造成内存的泄露,因此这里只能采用返回对象的方式

const Rational operator*(const Rational& lhs,const Rational& rhs){
	return Rational(......);
}

条款22:将成员变量声明为private

条款23:宁以non-member,non-friend 替代member函数

可以将两者放到同一个namespace当中

namespace{
	void function();
	class class1{
	};
}

条款24若所有参数皆需类型转换,请为此采用non-member函数

同样为Rational类,现在要执行

const Rational tmpe(2);

(1)result= tmp*2;

(2)result= 2*tmp;

(1)没有问题(2)确实有问题的,因为2不是一个对象,只是一个基本类型

如果这里把乘法的实现变为一个non-member函数,上面的两种调用都是可行的

const Rational operator*(const Rational & a,const Rational & b){
	return ......;
}

这是可以找到上述函数,从而可以每一次序的对两只进行隐式类型转化

时间: 2025-01-09 00:34:53

Effective C++ 随笔(4)的相关文章

Effective C++ 随笔(2)

条款5 了解c++默默编写并调用哪些函数 编译器自动生成的copy 构造函数,copy赋值操作符,析构函数,构造函数,这些都是public和inline的,此处inline的意思是他们的定义都是在头文件当中的 假设有一个引用类型的数据成员,那么上面的赋值操作是不对的,因为引用不能改变 条款6 如不想使用编译器自动生成的函数,就该明确拒绝 上面的赋值构造函数,赋值操作符都可以有编译器自动生成,为了拒绝使用上面两种函数,可以创建一个将这种函数定义私用成员的类,从而不会使用这些函数 class Unc

Effective C++ 随笔(3)

条款12: 以对象管理资源 两种只能指针: std:auto_ptr<> 当使用copy操作室,原先的智能指针指向为null std:tr1:share_ptr<int> spi(); 当可以多个指向同样的地址,但是当delete是会进行根据指向改地址的指针数量是否要delete这块内存 条款13 在资源管理中小心copying行为 class Lock{ public: explicit Lock(Mutex* pm):mutexPtr(pm){ lock(mutexPtr);

Effective C++ 随笔(1)

条款一 c++ 为一个语言联邦 1.四个层次 C:blocks,语句,预处理器,内置数据类型,数组,指针 面向对象的C++:封装,多态,继承 Template C++ STL 条款二 尽量以const,enum,inline代替#define Static const 常量的声明和定义,声明应该是在头文件当中,定义是在实现文件当中.对于基本类型需要一个类似赋值的语句,例如: const double classname::membername = 12; 但是对于对象的定义使用下面的方式 cla

《Effective C++》读书笔记汇总

我之前边读<Effective C++>边写下每个条款的读书笔记,这一版是C++11之前的版本.这里我将每个条款令我印象深刻的点小结一下. 1.C++包括:Plain C(面向过程).OOP(面向对象).模板(泛型和模板元编程).STL(C++标准库). 2.用inline.enum.const代替#define.#define定义的宏,一旦复杂起来,高手都很难掌控.不要带入C的习惯. 3.灵活使用const前缀.不需要进行改变的数据加上const前缀.指针的const前缀有两种形式,cons

C#博客随笔之六:数据绑定

这一篇随笔记录的是在完成程序中遇到的一些情况 首先要讲的是MVVM 所谓MVVM就是Model,View,ViewModel 下面是MVVM的优点(引用自百度百科): MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大优点1. 低耦合.视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变.2. 可重用性.你可以把一些视图

Effective Java之内部类

Effective Java中对类的权限,接口等的要求,总结起来就是够用就行,不要赋予过多的访问权限,类的定义也是,如果某个类只会在类的内部使用,那就将该类定义为内部类吧. 内部类分为四种: 1.静态内部类:静态内部类就是在class前面多了static关键词的内部类,这种类和类的静态方法和静态变量一样,针对类本省进行操作,在静态内部类中可以随意访问其所在类的静态方法和静态变量. 2.非静态内部类:和静态内部类相对于,其实在类内部定义的所有东西只是受到访问修饰符的限制,所以非静态内部类和类的非静

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和

Effective Objective-C 2.0重读笔记---1

上次看这本书的时候匆匆走了一遍,最近不太忙,重温了一遍,把笔记写出来~.. 有兴趣的可以去买一本,感觉这本书还是挺不错的 由于大部分是在坐车的时候用手机写的,所以代码很少,图也很少 1. 尽量使用向前声明,延后引入头文件的时间,这样可以减少编译时间2. 使用arraywithobjects:....如果遇到为空的变量,就会自动终止,后面的变量便会添加不上,切不会报错,会造成数据不一致问题,所以尽量使用字面量语法创建相关对象,减少出错且减少代码量3. 使用字面量创建的对象都是不可变的,如果要获得可

Abby&#39;s 学习php5随笔

2017.6.27 Abby's cakephp2 学习之旅 下载了XAMPP集成开发环境,然后配置其数据库,参考学习教程, 1.建立表单. 配置完信息如下,Cache Apache默认在windows下是system用户,所以权限最高,但xampp集成环境中的apache确是administor 如何更改apache用户为system 静默开发.(一种开发方法,番茄ToDo中的学霸模式有些相似) 如何设置.ctp的显示 http://cakephp2.local/posts/index怎么就可