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

原创 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。
                                                                                                                
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

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

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

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

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

Java是传值还是传址引用

  • 2007-04-20 17:28
  • 52KB
  • 下载

java 传值 还是 传引用

前言大家都知道,对于基本类型(int char float等等),java是传值。对于某个对象,java传递的是什么呢?疑惑 最近刷 leetcode 删除链表一个节点的时候, 遇到这个问题 ...

Python 函数中,参数是传值,还是传引用?

Python 函数中,参数是传值,还是传引用?在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码。

Java实参和形参与传值和传引用

实参和形参的定义: 形参出现函数定义中,在整个函数体内都可以使用,离开函数则不能使用。 实参出现在主函数中,进入被调函数后,实参变量也不能使用。 形参和实参的功能是做数据传送。发生函数调用时,主...

Java到底是传引用还是传值?深度剖析

Java到底是传引用还是传值? java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用传递? 一道面试题目...

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

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

5个php实例,细致说明传值与传引用的区别

传值:是把实参的值赋值给行参 ,那么对行参的修改,不会影响实参的值传引用 :真正的以地址的方式传递参数传递以后,行参和实参都是同一个对象,只是他们名字不同而已对行参的修改将影响实参的值 说明: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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