尽量用“传引用”而不用“传值”--------(读后感)

原创 2007年09月12日 22:40:00
 /*
注:转载请保留下面完整信息
From   http://blog.csdn.net/missvip/    By 凌剑
*/
为什么EffectiveC++提出尽量用“传引用”而不用“传值”了?今天重温习了一下EffectiveC++的ITEM 22,感觉又有了新的体会,加深了对传引用与传值的认识与了解。

  • 引用不会引起对象的构造与析构,所以可以提高程序的运行效率。下面以例子说明传引用与传值会带来程序哪些方面效率的差异。           
 
#include <iostream>
#include <string>
using namespace std;
 
class Base
{
public:
    Base(string data)
    {

       m_data =data;

       cout<<"Base的构造函数:"<<m_data<<endl;
    }
    Base(const Base & other)
    {

       m_data =other.m_data;

       cout<<"Base的拷贝构造函数:"<<m_data<<endl;
    }

    Base & operator =(const Base &other)

    {

       m_data =other.m_data;

       return *this;

    }
   ~Base()
    {
       cout<<"Base的析构函数:"<<endl;
    }
private:
    string m_data;
};
 
void TestFunc(Base str)
{
    return;
}
 
void TestFuncOther(Base &str)
{
    return;
}
int main(void)
{

    Base obj1("Hello World!");

 
    TestFunc(obj1);
 
    TestFuncOther(obj1);
    return 0;
}

  •  我们可以清楚的看到调用TestFunc(obj1);将会调用拷贝构造函数,与析构函数。而通过传引用不会构造新的对象,可以很好的提高程序的运行效率。
     传值还可能造成“切割问题”,看下面的例子就明白了:
#include <iostream>
#include <string>
using namespace std;
 
class Base
{
public:
    Base(string data)
    {

       m_data =data;

    }
    Base(const Base & other)
    {

       m_data =other.m_data;

    }

    Base & operator =(const Base &other)

    {

       m_data =other.m_data;

        return *this;
    }
    virtual void show(void) const
    {
       cout<<"Base输出内容:"<<m_data<<endl;
    }
    ~Base()
    {
    }
 
private:
    string m_data;
};
 
class Derive:public Base
{
public:
    Derive(string data):Base(data)
    {

       m_data =data;

    }
    virtual void show(void) const
    {
       cout<<"Derive输出内容:"<<m_data<<endl;
    }
    ~Derive()
    {
    }
 
private:
    string m_data;
};
 
void TestFunc(Base str)
{
    str.show();
    return;
}
 
void TestFuncOther(Base & str)
{
    str.show();
    return;
}
int main(void)
{

    Derive obj1("Hello World!");

 
    TestFunc(obj1);
 
    TestFuncOther(obj1);
    return 0;
}
 输出结果为:
Base输出内容:Hello World!
Derive输出内容:Hello World!
请按任意键继续. . .
大家也许觉的奇怪为什么TestFunc(obj1);没有输出"Derive输出内容:Hello World!",毕竟show(void)声明为了virtual 呀!按照多态的概念应该输出是"Derive输出内容:Hello World!"
WHY?
原来将Derive类型的对象通过传值时,产生了切割,根据C++对象模型,在传值时强制转化成了Base型的对象模型,所以进入到TestFun后只能调用到基类的函数show。
                                                                                                                

第20条:尽量使用“引用常量”传参代替传值

默认情况C++以传值方式传递对象至函数(继承自C语言的特征)。除非另外指定,否则函数参数都是以实际实参的复件(副本)为初值,并且,函数调用者得到的也是函数返回值的一个副本。这些副本是由对象的拷贝构造函...

尽量用pass-by-reference-to-const(const引用)替换pass-by-value(传值)

1、尽量以pass-by-reference-to-const替换pass-by-value,前者通常毕竟高校,并可避免切割问题(slicing problem)。 2、以上规则并不适...

[Effective C++第三版•中文版][第20条]尽量使用“引用常量”传参,而不是传值

默认情况下, C++ 为函数传入和传出对象是采用传值方式的(这是由 C 语言继承而来的特征)。除非你明确使用其他方法,函数的形式参数总会通过复制实在参数的副本来创建,并且,函数的调用者得到的也是函数返...
  • guqiwei
  • guqiwei
  • 2012年03月14日 19:44
  • 1321

Java是传值还是传址引用

  • 2007年04月20日 17:28
  • 53KB
  • 下载

java 函数形参传值和传引用的区别

java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清。   (一)基本数据类型:传值,方法不会改变实参的值。   public class TestFun {   pub...

Java参数传值还是传引用

作者:fbysss msn:jameslastchina@hotmail.com   blog:blog.csdn.net/fbysss 声明:本文由fbysss原创,转载请注明出处 关键字:...

Python函数调用“传引用”还是”传值“

【结论】  结论:python不允许程序员选择采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者...

java传值与传引用的三种情况

大家先看一个例子:  public class Example{        String str=new String("good");        char[]ch={'a','...

Python FAQ1:传值,还是传引用?

在C/C++中,传值和传引用是函数参数传递的两种方式。由于思维定式,从C/C++转过来的Python初学者也经常会感到疑惑:在Python中,函数参数传递是传值,还是传引用呢? 看下面两段代码: ...

java的传值和传引用的区别

java是传值还是传引用,这个估计很多人至今都很糊涂,这里有篇文章写的还是可以的,大家可以看看。。   这个写的还是比较清楚,只是不够深入。 1. 简单类型是按值传递的   Java 方法的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:尽量用“传引用”而不用“传值”--------(读后感)
举报原因:
原因补充:

(最多只允许输入30个字)