在main()内使用CLASS::member; 与 object.member调用成员的区别

JoshuaLi 2003-02-25 09:49:30
//...
class CLASS
{
public:
void f1() {}
int var;
//...
};

int main(int argc, char* argv[])
{
CLASS::f1(); // [1]
CLASS::var; // [1]

CLASS object;
object.f1(); // [2]
//...
return 0;
}

/*
1: 在main()内通过“类名::成员名”调用成员(函数/变量)可以吗。可以,为什么?
不可以,又为什么?(即// [1] 与 // [2] 正确吗,为什么?不正确吗,为什
么?)。他与通过“对象.成员”调用成员有什么“意义”上的区别。

2: 如果有人要骂我的话,请在成员前加上static再说吧。尤其是为什么在没有
static时// [1]不行呢,仅是一个规则,还是说可以用其他的理论解释。
*/
...全文
36 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
JoshuaLi 2003-02-25
  • 打赏
  • 举报
回复
// 此帖在VC/MFC基础类也有100分

http://expert.csdn.net/Expert/topic/1462/1462543.xml?temp=.3235285
cococut 2003-02-25
  • 打赏
  • 举报
回复
//“函数代码是构造函数分配的吗?”
sorry,是我理解错误!
JoshuaLi 2003-02-25
  • 打赏
  • 举报
回复
回复人: cococut(往事如屁!!!) ( ) 信誉:100 2003-02-25 11:33:00 得分:0


//我认为因为尚为分配,因而成员不存在!
没错!没有定义对象,就没有调用构造函数,没有分配内存(属性和函数代码)。
所以就无法调用!


///
cococut喜欢讲“属性” --a java fan :), 但是“函数代码是构造函数分配的吗?”
JoshuaLi 2003-02-25
  • 打赏
  • 举报
回复
回复人: westar(星爷(一周内结贴)) ( ) 信誉:100 2003-02-25 11:30:00 得分:0


好,现在用楼主的假设:我认为因为尚为分配,因而成员不存在。
那么,现在我定义了一个对象:
main(){
CLASS oc;
}
然后,楼主的意思,是不是现在就可以使用:
CLASS::fun();来调用类的非static函数?

///
多谢!
您认为CLASS::fun();在存在CLASS oc;的前提下 --即为一定强加于 “oc”这个对象吗?如果有CLASS oc;CLASS oc2;CLASS oc2;呢?
cococut 2003-02-25
  • 打赏
  • 举报
回复
//我认为因为尚为分配,因而成员不存在!
没错!没有定义对象,就没有调用构造函数,没有分配内存(属性和函数代码)。
所以就无法调用!
JoshuaLi 2003-02-25
  • 打赏
  • 举报
回复
谈谈自己的this --我在main()内使用,关this十么事?which this pointer? 这至少要在成员内部才能谈的上吧。如看法/语气不对,请指正/包涵。
westar 2003-02-25
  • 打赏
  • 举报
回复
好,现在用楼主的假设:我认为因为尚为分配,因而成员不存在。
那么,现在我定义了一个对象:
main(){
CLASS oc;
}
然后,楼主的意思,是不是现在就可以使用:
CLASS::fun();来调用类的非static函数?
JoshuaLi 2003-02-25
  • 打赏
  • 举报
回复
定义,实现? 我想或许应改成“...,使用”
westar 2003-02-25
  • 打赏
  • 举报
回复
用用这个例子:
这样的调用在继承中用到:
class A
{
public:
void fun(){}
}
class B:pubilc A
{
void fun()
{
A::fun();//调用A类的fun代码<---这里之所以可以这样调用,因为这里隐含了this指针:
//这一句可以翻译成: A::fun(this);,这样的话,fun()就知道他要对哪个 对象进行操作,而在main()里面直接调用A::fun(),就不会有this指针传过去。
}
}
JoshuaLi 2003-02-25
  • 打赏
  • 举报
回复
“...声明,定义,实现...”

///
定义,实现? 我想或许还有个“使用”
JoshuaLi 2003-02-25
  • 打赏
  • 举报
回复
//在main()这类主“执行”代码中不可
以上各位都说的很清楚!没有this指针!

///
我认为因为尚为分配,因而成员不存在。不觉得与this指针又很大关系。再请指教
westar 2003-02-25
  • 打赏
  • 举报
回复
我想,楼主现在首先要弄清楚一下类的声明,定义,实现这三者的关系先,不然的话,只会在这里绕来绕去钻进牛角尖
cococut 2003-02-25
  • 打赏
  • 举报
回复
//为何在这类非“执行”(继承)中可以

子类可以访问父类的任何非私有成员,
当分配一个子类的对象内存空间的同时,相应的分配了一个父类
的对象内存空间(包括属性和函数的代码区),子类可以访问父类
的内存空间,因此可以在子类中访问父类的函数代码区。
之所以用A::是告诉编译器一下要调用的是父类的fun(),而不是子类
的fun().

//在main()这类主“执行”代码中不可
以上各位都说的很清楚!没有this指针!
charlie_tang 2003-02-25
  • 打赏
  • 举报
回复
跟this有什么关系并不重要,重要的是,不是static的话,1没有办法确定使用的函数或者属性的地址!
JoshuaLi 2003-02-25
  • 打赏
  • 举报
回复
“...这样的调用在继承中用到:...”

///
为何在这类非“执行”(继承)中可以,而在main()这类主“执行”代码中不可 --是因为他未受分配根本尚不存在吗???

而直接定义一个函数却可直接使用
westar 2003-02-25
  • 打赏
  • 举报
回复
跟this指针有关系,不信的话你找本<think in c++>中文版,看看166页。
kevin_wang(kevin神)的解释说白了也是跟this指针有关
类名::成员名这种做法是根本不成立的,因为类只是相当于一个type,你这样子做,相当于:
struct mystruct{
int i;
};
main()
{
mystruct::i;
}
明白没有?类只是一个struct,一个加了权限管理的struct,而不是一个object。
cococut 2003-02-25
  • 打赏
  • 举报
回复
如果成员不是static的话,
CLASS::f1(); // [1]
CLASS::var; // [1]
是不正确的;

这样的调用在继承中用到:
class A
{
public:
void fun(){}
}
class B:pubilc A
{
void fun()
{
A::fun();//调用A类的fun代码
}
}
::更多的是作为一种引用域存在,大量用在namespace中
JoshuaLi 2003-02-25
  • 打赏
  • 举报
回复
个人认为与this指针无关。这样的回复肯定没分

是否解释为没有定义对象 --〉non-static成员还为分配,因而尚不可用类名::成员名。应该是kevin_wang(kevin神)的解释。不过还是不大清楚,请不吝指教!
同桌老王 2003-02-25
  • 打赏
  • 举报
回复
STATIC函数或成员在CLASS内部都有固定的位置和空间存放,可以直接引用,而其他类型则要求动态联褊上去,方可引用,因为在没有实例化前,其他函数(其实是一个地址)根本不知道应该指向哪,而静态的是确定一个地址。
NoneSoVile 2003-02-25
  • 打赏
  • 举报
回复
类的某个特定对象都有一个this指针,指向本身
通过这个指针才能操作本身的成员,而不是操作其他对象的成员
就像object.f1();//实际上是 object.f1(this)
静态成员函数是没有this的,因为他不能操作类的特定对象的成员变量
也就是静态成员函数只能操作为所有这各类的所有对象共享的静态成员变量

这就是两者的区别,不仅仅是规则,是编译器的需要
加载更多回复(13)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧