已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【成都c+培训】C+编程中需要注意的几点1、最好不要使用引用返回值有同学在传递的参数的时候使用引用方式传递,避免了临时对象的创建,提高了效率,那么在返回值的时候能不能使用引用呢?看如下代码 class Rational public: Raional( int numerator = 0, int denominator =1); . private: int d, d; friend Rational operator* (const Rational& lhs, const Raional& rhs) ; ; Rational Rational:operator* (const Rational& lhs,const Raionl&rhs) return Rational result(lhs.n*rhs.n,lhs.d*rhs.d); 这个类就是我们前面所介绍的有理数类。这里想想会发生一次类的构造与类的析构,那么如果使用引用就可以避免这个问题吗?达到提高效率吗?函数创建新对象有两种方法,一个是在栈(statck)中创建,一个是在堆(heep)中创建。 People p(a,b) /栈中创建 People *p = new People(a,b) /堆中创建 现在首先考虑在栈中创建,但是这个创建的变量是一个局部变量,会在退出函数之前销毁。 const Rational& operator* (const Rational& lhs, const Rational & rhs) Rational result(lhs.n*rhs.n,lhs.d*rhs.d); return result; 在函数内以stack方式空间创建对象是局部对象,任何函数如果返回一个引用指向某个局部对象,都会发生错误。因为局部对象在函数退出之前被销毁了,意味着reference所指的对象不存在。 于是考虑在堆中创建 const Rational& operator* (const Rational& lhs, const Rational & rhs) Rational* result=new Rational(lhs.n*rhs.n,lhs.d*rhs.d); return *result; 现在又发现了一个问题,new出来的对象由谁来delete?好这个问题先占时不考虑看下面情况 Rational w,x,y,z; w=x*y*z; 这里同时一个语句调用了两次operator*,意味着new了两次,也就需要delete两次。但是这里没有合理的办法让opertaor*使用者进行那些delete调用,因为无法让使用者获取返回的指针,这将导致资源泄漏。 于是考虑返回一个引用,其指向定义于函数内部的static Rational对象。 const Rational & operator*(const Rational& lhs,const Rational & rhs) static Rational result; result = .; return result; 那么显而易见就是多线程,在多线程环境下,这样写安全吗?好如果说不关多线程。那么如下代码会发生什么? bool operator = (const Rational& lhs, const Rational& rhs); . Raional a,b,c,d; if(a*b) = (c*d) . 上述if语句表达式无论a,b,c,d为何值都是true,因为它们都指向同一个静态值。 2、最好不要将所有变量定义放在语句开头。有同学可能上过C语言课程,喜欢学习C的,喜欢将所有的变量定义放在开头,但是在C+中,我建议最好不要这样做,因为定义一个变量时,程序便注定需要进行一次构造与析构。例如在下面程序:大概意思我们允许1米8以下并且年龄在60岁以下的同学买票进入。 1 class People.; 2 class Ticket.; 3 bool Isvalid(const People&p). 4 void Banding(const People& p,Ticket& t); 5 Ticket buyTicket(const People& p) 6 7 Ticket t; 8 if(Isvalid(p) return NULL ; 9 /信息与票绑定10 Banding(p,&t);11 return t;12 假如这里检测买票人条件不符合,那么就不能进入买票从而进行信息与绑定操作,那么这里Ticket t语句就让该函数白白承受了一次Ticket构造成本与析构的成本。所以最好不要将变量提前定义,最好在要用到的时候定义,避免不必要的性能开销。上面例子改成下面这样即可: 1 class People.; 2 class Ticket.; 3 bool Isvalid(const People&p). 4 void Banding(const People& p,Ticket& t); 5 Ticket buyTicket(const People& p) 6 7 if(Isvalid(p) return NULL ; 8 Ticket t; 9 /信息与票绑定10 Banding(p,&t);11 return t;12 3、最好不要做过多的类型转换C+规则的设计目标之一是,保证“类型错误”绝不可能发生。理论上程序通过编译,就表示它并不企图在任何身上执行任何不安全,荒谬的操作。可惜类型转换破环了类型系统,它可能导致任何种类麻烦,有些非常麻烦。就例如本文最后一个代码例子。C和C+都支持隐形类型转换,同时C+有四种显示转换操作符。成员函数与非成员函数的抉择里有介绍。但是建议最好不要做过多的类型转换,能避免就避免。类型转换往往也不是按照你的意思,首先看一个例子: 1 #include 2 3 class base 4 5 public: 6 base():a(0),b(0) 7 base(const int& x,const int& y) 8 :a(x),b(y) 9 virtual void init()10 11 a=5;12 b=5;13 std:coutin base a value is astd:endl;14 std:coutin base b value is bstd:endl;15 16 17 int get_a() const18 19 return a;20 21 22 int get_b() const23 24 return b;25 26 private:27 int a;28 int b;29 ;30 31 class derived:public base32 33 public:34 derived(int x,int y):base(x,y)35 void init()36 37 static_cast(*this).init();38 39 ;运行结果为in base a value is 5in base b value is 5a value is 2b value is 2这里将derived类型转化为base,但是调用base:init()函数并不是当前对象上的函数,而是早前转型动作所建立的一个*this对象的base的副本,所以当我们尝试改变对象内容,其实改变的是副本内容,其对象内容并没有被改变。 如何解决这个问题呢?我们可以直接声明调用基类的函数 1 class derived:public base 2 3 public: 4 derived(int x,int y):base(x,y) 5 void init() 6 7 /static_cast(*this).init(); 8 base:init(); 9 10 ;运行结果为:in base a value is 5in base b value is 5a value is 5b value is 5或许此时你记起来应该使用dynamic_case(如果看过以前的文章的话:它用于安全地沿着继承关系向下进行类型转换)。使用dynamic_cast直接出现错误。 1 class derived:public base 2 3 public: 4 derived(int x,int y):base(x,y) 5 void init() 6 7 /static_cast(*this).init(); 8 /base:init(); 9 dynamic_cast(this)-init();10 11 ;运行结果为:段错误 ((主存储器)信息转储)假设一个类有五层的单继承关系,如果在该对象上执行dynaic_cast,那么会有多达五次的strcmp调用,深度或者多重继承的越多,成本越高。之所以需要dynamic_cast是因为想在derived class对象上执行 derived class操作函数,但是目前只有一个指向base的指针或者引用,这个时候可以用它们来处理。成都c+培训哪里好?c+就业怎么样?选择达内c+培训开启企业定制就业直通车,达内科技
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年政府公职岗位招聘面试参考题库及参考答案
- 2025年民生保险顾问岗位招聘面试参考试题及参考答案
- RNA病毒信号机制-洞察与解读
- 2025年时尚策划专员岗位招聘面试参考试题及参考答案
- 2025年广告文案师岗位招聘面试参考试题及参考答案
- 2025年媒介策划经理岗位招聘面试参考题库及参考答案
- 2025年市场研究经理岗位招聘面试参考试题及参考答案
- 2025年补习班负责人岗位招聘面试参考试题及参考答案
- 2025年轻工产品设计师岗位招聘面试参考试题及参考答案
- 2025年医学科学联络员岗位招聘面试参考试题及参考答案
- 2025榆林镇北台、红石峡景区招聘(26人)考试笔试模拟试题及答案解析
- 村干部考入事业编面试真题(含答案)
- 铝锭贸易专业知识培训课件
- 2025年及未来5年中国建筑劳务行业投资潜力分析及行业发展趋势报告
- 2025年中考历史试题分类汇编:世界近代史(选择题汇编)(第1期)解析版
- 定制化老年大学海外游学创新创业项目商业计划书
- 住房公积金政策宣传课件
- 会诊制度存在问题及整改措施
- 【生物】2025-2026学年人教版八年级生物上册期中考试复习测评试卷
- 外国语学校文化建设方案
- 穿越机组装教学课件
评论
0/150
提交评论