为什么类成员函数不能直接调用
既然成员函数直接为全局函数只不过加了this,那为什么不能直接调用,通过传入this来调用,为什么静态成员函数不能在不加类名的前提下使用?classA{staticvoi...
既然成员函数直接为全局函数只不过加了this,那为什么不能直接调用,通过传入this来调用,为什么静态成员函数不能在不加类名的前提下使用?
class A
{
static void Fun();
void Get();
}
main()
{
A a;
Get(&a);//传入this
Fun();//静态 这二种写法编译器不通过,为什么,
}
我的问题是为什么按照理论来说的可以,为什么实际却不行,难道是VS规定的原则,正确的使用方法我明白,我就是不明白为什么那样写。在上面的代码中,如何加一个全局函数
void Play(){} 在main里面可以直接调用Play 那为什么不可以直接调用Fun() 这个Fun()为静态应该充当一个全局的函数了。 展开
class A
{
static void Fun();
void Get();
}
main()
{
A a;
Get(&a);//传入this
Fun();//静态 这二种写法编译器不通过,为什么,
}
我的问题是为什么按照理论来说的可以,为什么实际却不行,难道是VS规定的原则,正确的使用方法我明白,我就是不明白为什么那样写。在上面的代码中,如何加一个全局函数
void Play(){} 在main里面可以直接调用Play 那为什么不可以直接调用Fun() 这个Fun()为静态应该充当一个全局的函数了。 展开
4个回答
展开全部
你理解有问题。
首先,类不是对象,而是类型。
它是声明了一种对象的类型,并不是一个实例化的对象。
类中的函数不供对象调用的,而不是全局的。
在你测试的例子中使用就有错误。
A a;//首先 你声明了一个A类型的对象a,但是并没有创建对象,(通俗理解也就是赋值)
一般正确的创建对象的方法是A a = new A();(调用了构造函数)这样儿就为a分配了A类型大小的内存空间。
像你这么定义时没问题的,但是使用之前是必须要实例化的。
Get(&a);//传入this 这可不是传入this,而是传入对象a。
你其实根本没清楚类是什么东西,假设你声明一个类A,其实A就跟int,char,double没什么区别,是一种类型,只不过A是一个对象的类型,而后者是基础类型。
A a = new A(); a.Get(); 为什么要这么用?说的直白一点儿get是a内部的函数,并不是全局的。
假设我又定义了一个A b = new A(); 你理解为全局的,那么直接使用Set()(假设A中定义有Set(){ x=0;})那你怎么知道是改变了a对象的x值还是b对象的x值?
用以要用a.Set()来调用,可以理解为调用a的Set方法来给a中的成员赋值。
望采纳。
看了楼上的回答和你的理解我必须补充一下,以免你从此走入歧途......
关于类中的静态方法,并不是说C++就这么规定的神马的,而是有其原因
每一种规则都是有原因的,并不是神马就是规则,
难道法规就是规定这么做么?当然不是,必须有其原因。(题外话)
首先你要明白为什么要声明静态成员函数,
静态成员函数主要为了调用方便,不需要生成对象就能调用,
静态数据成员也遵守public/protected/private访问规则。
静态成员函数只能访问类的静态变量,而类的成员函数也可以访问类的静态变量,这样就可以通过静态成员变量建立类的静态成员函数和类对象的关联关系。
而普通的全局函数没有这个作用。
我建议你去看看这篇贴子。不要别人说什么就信什么,而是要自己多研究。我说的也不一定对。
http://blog.csdn.net/liuzhanchen1987/article/details/7270829
首先,类不是对象,而是类型。
它是声明了一种对象的类型,并不是一个实例化的对象。
类中的函数不供对象调用的,而不是全局的。
在你测试的例子中使用就有错误。
A a;//首先 你声明了一个A类型的对象a,但是并没有创建对象,(通俗理解也就是赋值)
一般正确的创建对象的方法是A a = new A();(调用了构造函数)这样儿就为a分配了A类型大小的内存空间。
像你这么定义时没问题的,但是使用之前是必须要实例化的。
Get(&a);//传入this 这可不是传入this,而是传入对象a。
你其实根本没清楚类是什么东西,假设你声明一个类A,其实A就跟int,char,double没什么区别,是一种类型,只不过A是一个对象的类型,而后者是基础类型。
A a = new A(); a.Get(); 为什么要这么用?说的直白一点儿get是a内部的函数,并不是全局的。
假设我又定义了一个A b = new A(); 你理解为全局的,那么直接使用Set()(假设A中定义有Set(){ x=0;})那你怎么知道是改变了a对象的x值还是b对象的x值?
用以要用a.Set()来调用,可以理解为调用a的Set方法来给a中的成员赋值。
望采纳。
看了楼上的回答和你的理解我必须补充一下,以免你从此走入歧途......
关于类中的静态方法,并不是说C++就这么规定的神马的,而是有其原因
每一种规则都是有原因的,并不是神马就是规则,
难道法规就是规定这么做么?当然不是,必须有其原因。(题外话)
首先你要明白为什么要声明静态成员函数,
静态成员函数主要为了调用方便,不需要生成对象就能调用,
静态数据成员也遵守public/protected/private访问规则。
静态成员函数只能访问类的静态变量,而类的成员函数也可以访问类的静态变量,这样就可以通过静态成员变量建立类的静态成员函数和类对象的关联关系。
而普通的全局函数没有这个作用。
我建议你去看看这篇贴子。不要别人说什么就信什么,而是要自己多研究。我说的也不一定对。
http://blog.csdn.net/liuzhanchen1987/article/details/7270829
展开全部
语言本身就是这么规定的,没有原因。
不是任何编译器制定的规则,这是C++语言的规则。就好像无论你用什么编辑器写英文文章,你都得遵循英文语法和表达规范。
在类中的静态函数,必须加类名或对象来引用,这和全局函数不同。因为在类中的函数是属于类空间的,不是全局空间。
不是任何编译器制定的规则,这是C++语言的规则。就好像无论你用什么编辑器写英文文章,你都得遵循英文语法和表达规范。
在类中的静态函数,必须加类名或对象来引用,这和全局函数不同。因为在类中的函数是属于类空间的,不是全局空间。
更多追问追答
追问
类静态成员函数实际上就是一个全局函数,它也没有 this指针,和一个普通的全局函数是一样的,却使用方法有些区别(直接调用与加类名限定)你觉得这是语言本身规定的。
追答
在类中的静态函数,必须加类名或对象来引用,这和全局函数不同。因为在类中的函数是属于类空间的,不是全局空间。
这的确是语言本身规定的,你必须遵循语法规范。就因为它是C++语言,所以它才有这样的规范。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于2018-04-09
展开全部
static class oclas
{public static void Fun_a(){} static void Fun_b(){}}
class A{
static void Fun() { }
void GetTo() { }
public void Main()
{
Fun();GetTo(); //this关键字 可调用在此class里的成员;
A la = new A();//静态直接使用,不用this。
this.GetTo();
la.GetTo();
oclas.Fun_a(); //Fun_b不带 public关键字。
}
}
{public static void Fun_a(){} static void Fun_b(){}}
class A{
static void Fun() { }
void GetTo() { }
public void Main()
{
Fun();GetTo(); //this关键字 可调用在此class里的成员;
A la = new A();//静态直接使用,不用this。
this.GetTo();
la.GetTo();
oclas.Fun_a(); //Fun_b不带 public关键字。
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你要用点办法来骗过编译器才行啊
#include <stdio.h>
class A
{
public:
void Get();
};
void A::Get()
{
printf("hello w..d\n");
}
void (*f)();
int main()
{
A a;
f = (void (*)())&A::Get;
(*f)();
return 0;
}
#include <stdio.h>
class A
{
public:
void Get();
};
void A::Get()
{
printf("hello w..d\n");
}
void (*f)();
int main()
{
A a;
f = (void (*)())&A::Get;
(*f)();
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询