C++访问静态成员的问题
我是C++的新手,今天在书上看到了这样一段话:
如果使用成员选择运算符“.”和“->”来调用类的静态成员函数和静态数据成员时候,表达式中运算符“.”和“->”前面的表达式不会被求值,如果在这部分进行了函数调用,则这些函数永远也不会真正被调用。
例如:
假设1.变量i是类MyClass的静态成员变量
假设2.GetMyClass()的返回值是一个类型为MyClass的实例对象
则:GetMyClass().i = 1;
上面的表达式中,编译器不对GetMyClass()进行求值,实际上该函数永远不会被调用,函数的代码也不会被执行。
上面是书上说的,但是我实际编码中却发现不是这样的情况,GetMyClass()函数还是会被调用。以下是我的代码:
#include<iostream>
using namespace std;
class MyClass
{
public:
static int i;
static void setI(int v);
static int getI();
};
int MyClass::i;
void MyClass::setI(int v)
{
i = v;
}
int MyClass::getI()
{
return i;
}
MyClass GetMyClass()
{
cout<<"GetMyClass"<<endl;
return MyClass();
}
int main()
{
MyClass myObject;
myObject.i = 321;
GetMyClass().i=111;
GetMyClass().setI(123);
cout<<"myObject.i="<<myObject.i<<endl
<<"GetMyClass().i="<<GetMyClass().getI()<<endl;
return 0;
}
输出结果是:
GetMyClass
GetMyClass
GetMyClass
GetMyClass
myObject.i=123
GetMyClass().i=123
但是有一个警告:
warning C4101: 'myObject' : unreferenced local variable
我的疑问还有:
输出结果说明“.”和“->”前面的会被引用,但是那条警告不是说明myObject对象没被引用吗?这两者互相矛盾,不知是哪里出了问题?
希望哪位大虾指点一二,谢谢!
[解决办法]
加个构造函数就行了
MyClass(){};
warning C4101: 'myObject' : unreferenced local variable
这句是警告你 myObject 被声明 但未使用
[解决办法]
GetMyClass().i=123 ;
不同的编译器对此实现可能不一样,有些编译器会忽略GetMyClass()函数调用,另一些则可能生产了临时对象
(c++对象模型一书有论述)
[解决办法]
输出结果说明“.”和“-> ”前面的会被引用,
但是那条警告不是说明myObject对象没被引用吗?这两者互相矛盾,不知是哪里出了问题?
------------
即使
GetMyClass().setI(123); 返回了一个临时对象,
通过.或->访问static数据成员或成员函数,也不是对象的引用,
直接访问属于的数据(static)
[解决办法]
>假设1.变量i是类MyClass的静态成员变量
>假设2.GetMyClass()的返回值是一个类型为MyClass的实例对象
>则:GetMyClass().i = 1;
>上面的表达式中,编译器不对GetMyClass()进行求值,实际上该函数永远不会被调用,函数的代码也不会被执行。
这个结论应该是依赖于编译器的。因为理论上说,进行类方法调用根本就不需要对象的,所以在这种情况下,编译器完全可以在此直接调用static函数,不需要对GetClass()进行求值的。
warning C4101: 'myObject' : unreferenced local variable
从这个警告来看在执行语句时 myObject.i = 321; 编译器并没有用对象,而是直接进行了类方法调用。
我在DEV-C++里编译了一下,没有警告。
一楼已经给出了答案,加一个构造函数就行了。
[解决办法]
你自己再看好好看一遍,你的代码和别人给你的回复
你觉得矛盾的是怎么理解的呢?.
这两条语句中对“myObject”的使用不起作用,跟下面两条语句
---------
static数据成员并不是属于对象,即使你通过对象引用,还是会被转换成形如MyClass::i
GetMyClass().i=111; 这里没警告并不意味这说是通过对象来调用的
只是这是一个临时对象,编译器就不会在出警告信息了。
[解决办法]
假设1.变量i是类MyClass的静态成员变量
假设2.GetMyClass()的返回值是一个类型为MyClass的实例对象
则:GetMyClass().i = 1;
上面的表达式中,编译器不对GetMyClass()进行求值,实际上该函数永远不会被调用,函数的代码也不会被执行。
-----------------------------------------------------
我发表一下我的看法无论如何程序流是肯定进入GetMyClass函数里了。而你的代码里还有别的部分代码,如输出什么的。
而你的书上说的,我觉得很大程度上是依赖于编译器的,或者说是编译期相关的。而从本质上讲这里是不应该进行函数调用的。warning C4101: 'myObject' : unreferenced local variable
而这句警告也恰恰证明了这点。只是函数的话可能有别的代码,所以编译器有的进行了优化,忽略了调用而有的则没有。
也许正如 “不接不舒服斯基”说的,你的书上说的太绝对了。世上没有绝对的事。