C++这样用行吗?
- C/C++ code
class S {public: int &a; //这样? int b; int &c = b; //这样?}; //貌似都不行现在我假设有这么个需求, 就是类中需要保留一个变量的引用, 但是类外可以修改这个变量并且同时同步到类中的这个变量.
例如:
- C/C++ code
class Student {public: Student(); int &a; //这里有个变量a, 它需要指向某个全局变量ga, 然后修改ga=5就可以得到a=5. int *pa; //像这样当然行了. 但是可以用引用来处理吗? //如果是指针的话, 就可以让pa=另一个地址; //如果是引用的话, 可以对它重新赋值到另一个变量吗? };有点乱, 是吧.
[解决办法]
类的成员变量可以是引用,但必须在构造函数中初始化。
- C/C++ code
#include<iostream>class C {public: C(int *n) : m_a(*n) {} int& m_a;};int main(){ int n = 1; C o(&n); n = 99; std::cout << o.m_a << std::endl; return 0;}
[解决办法]
上面的代码有点画蛇添足了,无需用指针过渡。
构造函数这样写就行:
C(int& n) : m_a(n) {}
相应的,这样创建对象:
C o(n);
[解决办法]
- C/C++ code
class Student {public: Student();//见三楼 引用成员要用初始化列表初始化 原因可以自己搜索去 int &a; //这里有个变量a, 它需要指向某个全局变量ga, 然后修改ga=5就可以得到a=5. //请注意区分取地址操作int *a = &b 和 引用声明 int &b = a; int *pa; //像这样当然行了. 但是可以用引用来处理吗? //可以 //如果是指针的话, 就可以让pa=另一个地址; //不可以 引用只能初始化 比如你在构造函数内部给引用赋值 就会出错 //如果是引用的话, 可以对它重新赋值到另一个变量吗? };
[解决办法]
[Quote=引用:]
类的成员变量可以是引用,但必须在构造函数中初始化。
C/C++ code
#include <iostream>
class C {
public:
C(int *n) : m_a(*n) {}
int& m_a;
};
int main()
{
int n = 1;
C o(&n);
n = 99;
std::cout < < o.m_a < <……
[/Quote]
貌似大家没有关注到楼主的需求,他希望把类的引用成员变量作为外部某变量的别名,修改外部变量时顺带改变该类的引用变量。
下面的程序显示,楼主的意图实现不了,期待牛人分析深层次的原因
#include <iostream>
using namespace std;
class A
{
public:
A(int a): a(a){}
int &a;
};
int main( int argc, char** argv)
{
int a = 10;
A objA(a);
int& b = a;
cout < < "objA.a = " < < objA.a < < "\ta = " < < a < < "\tb = " < < b < < endl;
a = 20;
cout < < "objA.a = " < < objA.a < < "\ta = " < < a < < "\tb = " < < b < < endl;
A objB(a);
cout < < "objB.a = " < < objB.a < < "\ta = " < < a < < endl;
objB.a = 50;
cout < < "objB.a = " < < objB.a < < "\ta = " < < a < < endl;
return 0;
}
output:
objA.a = 10a = 10b = 10
objA.a = 0a = 20b = 20
objB.a = 20a = 20
objB.a = 50a = 20
[解决办法]
可以的:
- C/C++ code
#include <iostream>class T{ int &i;public: T(int &N):i(N){} int Num(){return i;}};using namespace std;int main(){ int n = 5; T a(n); cout << "n=" << n << " T().i=" << a.Num() << endl; n = 8; cout << "n=" << n << " T().i=" << a.Num() << endl; return 0;}