引用 && const 要注意的一些地方


参考自http://my.oschina.net/sasa/blog/7921,此外加上我自己的解释


(1)const和non-const引用

const引用可读不可改,与绑定对象是否为const无关

非const引用可读可改,只可与非const对象绑定


(2)引用可以绑定到哪些对象

非const引用只能绑定到与该引用同类型的对象。

double t = 9.3;
int& k = t;
//error

const引用则可以绑定到不同但相关的类型的对象或绑定到左值。


(3)引用的初始化

1.定义引用时必须进行初始化。初始化是指明引用指向哪个对象的唯一方法。

2.当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象。并且不可能将引用绑定到另一个对象。

 

 关于引用的初始化有两点值得注意:

1)当初始化值是一个左值(可以取得地址)时,没有任何问题;

2)当初始化值不是一个左值时,则只能对一个const T&(常量引用)赋值。而且这个赋值是有一个过程的:

首先将值隐式转换到类型T,然后将这个转换结果存放在一个临时对象里,最后用这个临时对象来初始化这个引用变量。

 

double dval = 3.14;

const int &ri = dval;

编译器会把这些代码转换成如以下形式的编码:

int temp =dval;                 // create temporary int from the double

const int &ri = temp;       // bind ri to that temporary

这样做的原因:如果 ri 不是 const,那么可以给 ri赋一新值。这样做不会修改 dval,而是修改了 temp。期望对 ri 的赋值会修改 dval 的程序员会发现 dval 并没有被修改。仅允许 const引用绑定到需要临时使用的值完全避免了这个问题,因为 const 引用是只读的

 (4)具体事例:

  1. <span style="font-size: 18px; ">  const doublet = 9.3;  
  2.   constint& k = t;  
  3.   cout<<&k<<endl;  
  4.   cout<<&t<<endl;</span>  

输出是

0012FF6C

0012FF74//使用了临时变量,所以地址不同

 

  1. <span style="font-size: 18px; ">  int t = 9;  
  2.   int& k = t;  
  3.   cout<<&k<<endl;  
  4.   cout<<&t<<endl;</span>  

输出是

0012FF74

0012FF74



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
纠正这个代码的错误之处#include <iostream> #include <string> using namespace std; class Fraction { private: int numerator; // 分子 int denominator; // 分母 public: Fraction(int num, int den); // 构造函数 // 重载运算符 Fraction operator+(const Fraction &fra) const; Fraction operator-(const Fraction &fra) const; Fraction operator*(const Fraction &fra) const; Fraction operator/(const Fraction &fra) const; Fraction& operator=(const Fraction &fra); void print() const; // 打印结果 }; // 构造函数 Fraction::Fraction(int num, int den) { // 省略部分代码 } // 重载加法运算符 Fraction Fraction::operator+(const Fraction &fra) const { // 省略部分代码 } // 重载减法运算符 Fraction Fraction::operator-(const Fraction &fra) const { // 省略部分代码 } // 重载乘法运算符 Fraction Fraction::operator*(const Fraction &fra) const { // 省略部分代码 } // 重载除法运算符 Fraction Fraction::operator/(const Fraction &fra) const { // 省略部分代码 } // 重载赋值运算符 Fraction& Fraction::operator=(const Fraction &fra) { // 省略部分代码 } // 打印最简分数或带分数 void Fraction::print() const { // 省略部分代码 } int main() { int x_num, x_den, y_num, y_den; cout << "Input x: "; scanf("%d/%d", &x_num, &x_den); // 格式化输入 cout << "Input y: "; scanf("%d/%d", &y_num, &y_den); // 格式化输入 Fraction x(x_num, x_den); Fraction y(y_num, y_den); Fraction result; // 加法 result = x + y; cout << "x+y="; result.print(); // 减法 result = x - y; cout << "x-y="; result.print(); // 乘法 result = x * y; cout << "x*y="; result.print(); // 除法 result = x / y; cout << "x/y="; result.print(); return 0; }
最新发布
05-25
这段代码看起来没有什么明显的错误,但是有一些需要注意地方: 1. 在类的定义中,构造函数应该放在 public 权限下,否则在 main() 函数中无法调用。 2. 使用 scanf() 函数进行输入时,需要包含头文件 <cstdio>。 3. 在 operator=() 函数中,应该返回一个引用类型的对象,即 Fraction&。 4. 在 main() 函数中,应该使用 cout 而不是 printf() 进行输出。 修改后的代码如下: ``` #include <iostream> #include <string> #include <cstdio> using namespace std; class Fraction { public: Fraction(int num, int den); // 构造函数 Fraction& operator=(const Fraction &fra); // 重载赋值运算符 Fraction operator+(const Fraction &fra) const; // 重载加法运算符 Fraction operator-(const Fraction &fra) const; // 重载减法运算符 Fraction operator*(const Fraction &fra) const; // 重载乘法运算符 Fraction operator/(const Fraction &fra) const; // 重载除法运算符 void print() const; // 打印结果 private: int numerator; // 分子 int denominator; // 分母 }; // 构造函数 Fraction::Fraction(int num, int den) { numerator = num; denominator = den; } // 重载赋值运算符 Fraction& Fraction::operator=(const Fraction &fra) { numerator = fra.numerator; denominator = fra.denominator; return *this; } // 重载加法运算符 Fraction Fraction::operator+(const Fraction &fra) const { int num = numerator * fra.denominator + denominator * fra.numerator; int den = denominator * fra.denominator; return Fraction(num, den); } // 重载减法运算符 Fraction Fraction::operator-(const Fraction &fra) const { int num = numerator * fra.denominator - denominator * fra.numerator; int den = denominator * fra.denominator; return Fraction(num, den); } // 重载乘法运算符 Fraction Fraction::operator*(const Fraction &fra) const { int num = numerator * fra.numerator; int den = denominator * fra.denominator; return Fraction(num, den); } // 重载除法运算符 Fraction Fraction::operator/(const Fraction &fra) const { int num = numerator * fra.denominator; int den = denominator * fra.numerator; return Fraction(num, den); } // 打印最简分数或带分数 void Fraction::print() const { int integer = numerator / denominator; int num = numerator % denominator; int den = denominator; int gcd = __gcd(num, den); num /= gcd; den /= gcd; if (integer != 0) { cout << integer << " "; } if (num != 0) { cout << num << "/" << den; } else { cout << 0; } cout << endl; } int main() { int x_num, x_den, y_num, y_den; cout << "Input x: "; scanf("%d/%d", &x_num, &x_den); // 格式化输入 cout << "Input y: "; scanf("%d/%d", &y_num, &y_den); // 格式化输入 Fraction x(x_num, x_den); Fraction y(y_num, y_den); Fraction result; // 加法 result = x + y; cout << "x+y="; result.print(); // 减法 result = x - y; cout << "x-y="; result.print(); // 乘法 result = x * y; cout << "x*y="; result.print(); // 除法 result = x / y; cout << "x/y="; result.print(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值