首页 相关文章 C++箴言:用传引用给const取代传值

C++箴言:用传引用给const取代传值


  缺省情况下,C++ 以传值方式将对象传入或传出函数(这是一个从 C 继续来的特性)。除非你非凡指定其它方式,否则函数的参数就会以实际参数(actual argument)的拷贝进行初始化,而函数的调用者会收到函数返回值的一个拷贝。这个拷贝由对象的拷贝构造函数生成。这就使得传值(pass-by-value)成为一个代价不菲的操作。例如,考虑下面这个类层级结构:
  
  class Person {
    public:
   Person(); // parameters omitted for simplicity
   virtual ~Person(); // see Item 7 for why this is virtual
   ...
  
    private:
   std::string name;
   std::string address;
  };
  
  class Student: public Person {
    public:
   Student(); // parameters again omitted
   ...[ 查看全文 ]

2016-02-19 标签:
  • const引用是指向const对象的引用。 代码如下: const int i = 10; const int &ref = i; 可以读取ref,但不能修改。这样做是有意义的,因为i本身就不可修改,当然也不能通过ref来修改了。所以也就有将const变量赋值给非const引用是非法的。 代码如下: int &ref1 = i; // error: nonconst reference to a const object 非const引用是指向非const类型变量的引用。 const引用可以初始化为不同类型...[ 查看全文 ]
  • 关于 const 的一件美妙的事情是它允许你指定一种语义上的约束:一个特定的对象不应该被修改。而编译器将执行这一约束。它允许你通知编译器和其他程序员,某个值应该保持不变。如果确实如此,你就应该明确地表示出来,因为这样一来,你就可以谋取编译器的帮助,确定这个值不会被改变。 关键字 const 非常多才多艺。在类的外部,你可以将它用于全局常量或命名空间常量,就像那些在文件、函数或模块范围内被...[ 查看全文 ]
  • 1、右值引用引入的背景 临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题。但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了CopyElision、RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝。下面简单地介绍一下CopyElision、RVO,对此不感兴趣的可以直接跳过: (1)CopyElision CopyElision技术是为了防止某些不必要的临时对象产生...[ 查看全文 ]
  • 这是一个所有程序员都应该了解的小型的 C++ 词汇表。下面的条目都足够重要,值得我们对它们的含义务必取得完全一致。 声明(declaration)告诉编译器关于某物的名字和类型,但它省略了某些细节。以下这些都是声明: extern int x; // object declaration std::size_t numDigits(int number); // function declaration class Widget; // class declaration templatetypename T // template declarat...[ 查看全文 ]
  • Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 1、定义常量 (1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。  TYPE const ValueName = value;      const TYPE ValueName = value; (2)将const改为外部连接,作用于扩大至全局,编译时会分...[ 查看全文 ]
  • <C++实践系列C++中的引用(reference) 作者:张笑猛 提交者:eastvc 发布日期:2003-11-22 14:44:07 原文出处:http://objects.nease.net/ 1.简介 2.引用的语法 3.引用使用技巧     3.1 引用和多态     3.2 作为参数     3.3 作为返回值     3.4 什么时候使用引用 4. 参考资料 1.简介     引用是C++引入的新语言特...[ 查看全文 ]
  • 例如:这里程序文件开头有如下#define语句 代码如下: #define N 10 #define PI 3.14 #define MAX 10000 #define Heigth 6.65 ... ... 假设这里程序运行出错误,而且就是在我们使用这些常量有错误,此时编辑器应该会抛出错误信息。如果该信息提示6.65这里有错误,Ok如果你运气好你正好记得或者程序简单一眼能找到6.65表示什么,如果程序很复杂,而且报出6.65的文件是引用该文件,不记得,那么你...[ 查看全文 ]
  • 标签:Web开发
    代码如下: script type="text/javascript"  //取得传值的函数  function QueryString(qs)  {      var s = location.href.replace("?","?&").split("&");      var re = "";      for(i=1;is.length;i++)      (s[i].indexOf(qs+"=")...[ 查看全文 ]
  • 问题 C语言以及C++语言中的const究竟表示什么?其具体的实现机制又是如何实现的呢? 本文将对这两个问题进行一些分析,简单解释const的含义以及实现机制。 问题分析 简单的说const在C语言中表示只读的变量,而在C++语言中表示常量。关于const在C与C++语言中的使用以及更多的区别,以后有时间另开一贴说明。 那么const究竟是如何实现的呢? 对于声明为const的内置类型,例如int,short,long等等,编...[ 查看全文 ]
  • 假设你正在一个包含矩形的应用程序上工作。每一个矩形都可以用它的左上角和右下角表示出来。为了将一个 Rectangle 对象保持在较小状态,你可能决定那些点的定义的域不应该包含在 Rectangle 本身之中,更合适的做法是放在一个由 Rectangle 指向的辅助的结构体中: class Point { // class for representing points public: Point(int x, int y); ... void setX(int newVal); vo...[ 查看全文 ]
  • 引用类型也称别名,它是个很有趣的东西。在c++ 下你可以把它看作是另外的一种指针,通过引用类型我们同样也可以间接的操作对象,引用类型主要是用在函数的形式参数上,通常我们使用它是把类对象传递给一个函数。 引用对象采用类型名加上&符号和名称的方式进行定义。例如:(int &test;),这里我们就定义了一个int类型的名为test 的引用,但是int &test;这样的方式是不能够被编译成功的,因...[ 查看全文 ]
  • Form1中放一个Label1,一个Button1,Form1为主窗口,当点击Button1时,执行: Form2 f2 = new Form2(); f2.ShowDialog(this); Form2中放一个TextBox1,一个Button1,当点击Button1时执行: Form1 f1 = (Form1)this.Owner; f1.Label1.Text = this.TextBox1.Text;注意:Form1中的label1要设为public[ 查看全文 ]
  • 标签:Web开发
    二个框内值传递.不错的效果 代码如下: script type="text/javascript" defer="defer"  function $(value)  {   return document.getElementById(value);  }  function ch(s){   var p = new Array(0,1,2);   p[0] = '大学';   p[1] = '高中';   p[2]...[ 查看全文 ]
  • 标签:软件教程
    腾讯飞传是腾讯应用宝推出的一种移动应用安装新模式,只要保证手机QQ或者手机QQ空间任意一个在线,应用宝电脑版可以帮你智能判断在线账号,然后一键下载应用到手机,非常方便实用的功能,下面教教大家腾讯飞传怎么使用。 [ 查看全文 ]
  • 在上一篇文章中介绍了作为资源管理类支柱的 Resource Acquisition Is Initialization (RAII) 原则,并描述了 auto_ptr 和 tr1::shared_ptr 在基于堆的资源上运用这一原则的表现。并非所有的资源都是基于堆的,然而,对于这样的资源,像 auto_ptr 和 tr1::shared_ptr 这样的智能指针通常就不像 resource handlers(资源管理者)那样合适。在这种情况下,有时,你可能要根据你自己的需要去创建你自己的资源管理...[ 查看全文 ]
  • /*p129*/#include class CComplex{public: CCpomplex(double r=0,double i=0) { realPart=r; imagePart=i; } void print() { cout /*p129*/#include class CComplex{public: CCpomplex(double r=0,double i=0) { realPart=r; imagePart=i; } void print() { cout[ 查看全文 ]
  • 在设计良好的面向对象系统中,为了压缩其对象内部的空间,仅留两个函数用于对象的拷贝:一般称为拷贝构造函数(copy constructor)和拷贝赋值运算符(copy assignment operator)。我们将它们统称为拷贝函数(copying functions)。如果需要,编译器会生成拷贝函数,而且阐明了编译器生成的版本正象你所期望的:它们拷贝被拷贝对象的全部数据。 当你声明了你自己的拷贝函数,你就是在告诉编译器你不喜欢...[ 查看全文 ]
  • 首先是引用情形下的c++源码: 代码如下: void add(int a, int b, int&c) {     c = a + b; } int main() {     int a = 1;     int b = 2;     int c = 0;     add(a, b, c); } 下面是main对应的汇编码: 代码如下: ; 6    : int main() {     push    ebp  &...[ 查看全文 ]
  • 标签:PHP
      Author: Mitchell Harper 翻译    :Kefeng Nie (kefeng_nie@163.com) Date   :2002-10-15   一,简介   如果你对Unix/Linux有所了解的话,你应该知道他们大都自带了C和C++的编译器,分别是GCC和G++。Unix在程序安装及Make等许多地方使用到了这些编译器。利用一些控制台命令,C++和PHP, 我将向你介绍怎样生成一个完整的C++程序例子,他可以在用PHP程序来执...[ 查看全文 ]
  • 你不应该在构造或析构期间调用虚函数,因为这样的调用不会如你想象那样工作,而且它们做的事情保证会让你很郁闷。如果你转为 Java 或 C# 程序员,也请你密切关注本文,因为在 C++ 急转弯的地方,那些语言也紧急转了一个弯。 假设你有一套模拟股票处理的类层次结构,例如,购入流程,出售流程等。对这样的处理来说可以核查是非常重要的,所以随时会创建一个 Transaction 对象,将这个创建记录在核查日志...[ 查看全文 ]
手机页面 收藏网站 回到头部