初学者提问:c++ 参数列表初始化问题

问题描述

初学者提问:c++ 参数列表初始化问题

#include

using namespace std;

class c
{
public:
c(int m) :b(m) {};
void display()
{
cout << b << endl;
}
private:
int & b;
};

int main()
{
c ca(5);
ca.display();
return 0;
}
不知道为什么,输出了很大的数字

解决方案

把类定义里的int& b改成int b就可以正确运行了。
使用int&是有风险的,因为int&是引用变量,因此它必然需要有一个依托的载体(原变量)。例如int& b = a;,就是a为原变量,b是a的别名。
问题是:如果在使用b的时候,a已经被销毁了怎么办呢?这就是引用的风险,也是初学者常犯的错误。你的这个程序里面,b引用的是一个临时变量“m=5”,m的作用域仅限于c类的构造函数,构造函数一结束,这个变量的内存就被回收了,所以b指向的位置已经不再是原变量(实际上,原变量m已经不存在了)。再调用ca.display()访问b,访问到的就是一个不符合预期的数字。

解决方案二:

你私有数据中&b 是取地址的意思 ,所以说实际输出的是b=5的b的地址,而不是5;

时间: 2024-10-20 07:03:32

初学者提问:c++ 参数列表初始化问题的相关文章

c++-C++初始化参数列表问题?

问题描述 C++初始化参数列表问题? class CCQ{public: CCQ(int ival):iccq(ival) { printf(""CCQ ""); } virtual ~CCQ() { printf(""~CCQ ""); } virtual void TestBBQ() { printf(""TestCCQ ""); } public: int &iccq;};

java代码-java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的?

问题描述 java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的? class Demo03 { public static void main(String[] args) { A.show(); } } class A { //构造方法 A(){ System.out.println("构造方法执行"); System.out.println(b); System.out.println(c); } static A a=new A(); sta

python 参数列表中的self 显式不等于冗余_python

self在区分全局变量/函数和对象中的成员变量/函数十分有用.例如,它提供了一种作用域机制,我个人认为比Ruby的@和@@清晰多了,这可能是习惯使然吧,但它确实和C++.Java中的this很相似. 然而,self总是有令我困扰的地方,我以前在这里说过-我曾幻想能在Python3中这些能得以改进,然后通常会引发一轮热议并最终以人们所说的"显胜于隐"告终. 我在巴西的时候曾和Luciano Ramalho(巴西Python组织的主席)有过一次交谈.他让我明白并非无处不在的self让我困扰

java-[Java]关于重载方法中的可变参数列表

问题描述 [Java]关于重载方法中的可变参数列表 <Thinking in Java>第105页有一句话不理解 如何理解你应该总是只在重载方法的一个版本上使用可变参数列表,或者压根就不是用它 解决方案 就是当重载一个方法时,选择其中的一个重载使用可变参数,其他的避免使用,否则编译的时候容易出问题.具体的参看http://www.cnblogs.com/lanxuezaipiao/p/3190673.html 解决方案二: 这个道理很简单,比如说你有foo(int x int ... args

ocx atl-clsid的定义类型问题(初学者提问)

问题描述 clsid的定义类型问题(初学者提问) const CLSID CLSID_MyClass = {0x562052A7,0xF17C,0x408D,{0x99,0x9C,0xCC,0xF1,0xEB,0x9E,0xE7,0x14}}; MIDL_DEFINE_GUID(CLSID, CLSID_MyClass,0xB035F76C,0xF12D,0x4903,0xAE,0x9A,0x33,0x4D,0x27,0x4A,0xA8,0x5E); CLSID_MyClass 两者的区别是什么

window.open()的所有参数列表

window|window window.open()的所有参数列表经常上网的朋友可能会到过这样一些网站,一进入首页立刻会弹出一个窗口,或者按一个连接或按钮弹出,通常在这个窗口里会显示一些注意事项.版权信息.警告.欢迎光顾之类的话或者作者想要特别提示的信息.其实制作这样的页面效果非常的容易,只要往该页面的HTML里加入几段Javascript代码即可实现.下面俺就带您剖析它的奥秘. [1.最基本的弹出窗口代码] 其实代码非常简单: <SCRIPT LANGUAGE="javascript&

MySQL状态参数列表

  mysql> show status; +-----------------------------------+-----------+ | Variable_name | Value | +-----------------------------------+-----------+ | Aborted_clients | 0 | | Aborted_connects | 0 | | Binlog_cache_disk_use | 0 | | Binlog_cache_use | 0

java-[Java]可变参数列表的参数传递

问题描述 [Java]可变参数列表的参数传递 想问一下,可变参数列表Object... a 和 Object[] a 这两种写法到底有啥区别呢? class Abc{ } public class AboutObject { static void pr(Object... a){ //Object[] a for(Object i:a) System.out.print(i+" "); } public static void main(String[] args){ Object[

Thinking in java 可变 参数列表问题,请各位帮忙解决。

问题描述 Thinking in java 可变 参数列表问题,请各位帮忙解决. public class OverloadingVarargs3 { static void f(float i Character... args) { System.out.println(""first""); } static void f(char c Character... args) { System.out.println(""second&quo