c++ 函数:将非 const 参数传递给 const 引用参数
Posted
技术标签:
【中文标题】c++ 函数:将非 const 参数传递给 const 引用参数【英文标题】:c++ function: pass non const argument to const reference parameter 【发布时间】:2012-02-25 23:36:05 【问题描述】:假设我有一个接受 const 引用参数传递的函数,
int func(const int &i)
/* */
int main()
int j = 1;
func(j); // pass non const argument to const reference
j=2; // reassign j
这段代码运行良好。根据 C++ 入门,传递给该函数的参数如下所示,
int j=1;
const int &i = j;
其中i是j的同义词(别名),
我的问题是:如果 i 是 j 的同义词,并且 i 被定义为 const,代码是:
const int &i = j
redelcare 一个非 const 变量到 const 变量?为什么这个表达式在 c++ 中是合法的?
【问题讨论】:
【参考方案1】:引用是常量,而不是对象。它不会改变对象是可变的这一事实,但是您可以通过该对象的一个名称 (j
) 来修改它,而您不能通过另一个名称 (i
) 来修改它。
在 const 引用参数的情况下,这意味着 main
可以修改对象(因为它使用它的名称,j
),而 func
不能修改对象,只要它只使用它的名字,i
。 func
可以原则上通过使用const_cast
创建另一个引用或指向它的指针来修改对象,但不要这样做。
【讨论】:
你的意思是引用不是对象本身。那么如何理解 i 是 j 的同义词呢?这是否意味着 i 和 j 是同一个对象,因为 i 和 j 具有相同的物理地址? i 是对对象 j 的替代引用。所以是同义词。但是,您已经说过您不能使用“i”来更改它所指的对象。没有什么说您不能使用其他方法来修改 i 所指的对象。您使用该声明限制 i 的功能,而不是尝试扩展它们,这很好。 @xiaopang: 'i
' 和 'j
' 是名称。它们都指向同一个对象。我们经常说某物“是”它的名字,或者说名字“是”对象。例如,我可能会说“我是史蒂夫”。但这是不精确的术语,两者不是一回事。我也可以说,“'Steve' 以大写的 'S' 开头”。这并不意味着 I 以大写的“S”开头。 'Steve' 周围的引号表明我在谈论名称,而不是它所指的对象。 i
和 j
是同义词,因为它们都是同一个对象的名称,但它们作为名称的属性不同。【参考方案2】:
const int &i = j;
这声明了对常量整数的引用。 使用此引用,您将无法更改它引用的整数的值。
您仍然可以使用原始变量名 j 更改值,只是不使用常量引用 i。
【讨论】:
以上是关于c++ 函数:将非 const 参数传递给 const 引用参数的主要内容,如果未能解决你的问题,请参考以下文章