静态成员函数访问非静态成员
㈠ c++静态成员函数访问非静态数据成员
没有搞错
这是C++语法所决定的
C++类的静态成员变量和静态成员函数是所有实例共用的
这个和C的静态变量静态函数的概念不一样,需要理解
所以类静态函数访问非静态变量只有通过参数指明要访问的对象才可以
因为 i,j都是类对象当然可以访问私有成员
外部不允许访问私有成员是说类以外代码不允许访问
两个类实例间的访问也是在类内部完成的
void A::f(A a)
{
cout<<a.x;
}
这个本身是类的成员函数,当然可以访问
因为函数 f本身是静态函数,所以访问时要指明具体访问对象
这就在于正确理解
㈡ 静态成员函数为什么不能访问本类中的非静态成员
和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“∷”。如 Box∷volume( ); 实际上也允许通过对象名调用静态成员函数,如 a.volume( ); 但这并不意味着此函数是属于对象a的,而只是用a的类型而已。 静态成员函数的作用是为了能处理静态数据成员。 可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。 在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。假如在一个静态成员函数中有以下语句: cout<<height<<endl; //若height已声明为static,则引用本类中的静态成员,合法 cout<<width<<endl; //若width是非静态数据成员,不合法 但是,并不是绝对不能引用本类中的非静态成员,只是不能进行默认访问,因为无法知道应该去找哪个对象。如果一定要引用本类的非静态成员,应该加对象名和成员运算符“.”。如 cout<<a.width<<endl; //引用本类对象a中的非静态成员
㈢ c++ 静态成员函数能调用非静态成员吗
静态成员的定义是针对类的一个对象而言的,即该类的每个对象都有一套自己的静态成员变量和函数。如果想要静态成员函数调用非静态成员,那就必须有一个这个类的instance(实例)才行,例如:
classfoo{
public:
foo()
:m_i(0)
{}
staticvoidadd1(foo&instance);//实例传入函数
staticvoidadd1();//定义一个自身的静态实例
private:
staticfoom_instance;
intm_i;
};
voidfoo::add1(foo&instance)
{
instance.m_i=instance.m_i+1;
}
voidfoo::add1()
{
m_instance.m_i=m_instance.m_i+1;
}
谢谢,望采纳!
㈣ 静态成员函数为什么不可以调用非静态成员函数
原因如下;
和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“∷”。
如 Box∷volume( ); 实际上也允许通过对象名调用静态成员函数,如 a.volume( ); 但这并不意味着此函数是属于对象a的,而只是用a的类型而已。 静态成员函数的作用是为了能处理静态数据成员。 可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针。
由此决定了静态成员函数不能访问本类中的非静态成员。 在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。假如在一个静态成员函数中有以下语句: cout<<height<<endl; //若height已声明为static,则引用本类中的静态成员,合法 cout<<width<<endl; //若width是非静态数据成员,不合法。但是,并不是绝对不能引用本类中的非静态成员,只是不能进行默认访问,因为无法知道应该去找哪个对象。如果一定要引用本类的非静态成员,应该加对象名和成员运算符“.”。如 cout<<a.width<<endl; //引用本类对象a中的非静态成员
㈤ 线程的静态函数如何访问类的非静态成员函数或成员变量
静态成员函数不能访问非静态成员变量,这是规定。
但是你可以换下解决问题的思路。线程的入口函数除了可以锁静态成员函数,也可是全局函数。
在全局函数里获取主窗口的句柄之后,接下来可以访问各种成员变量。
㈥ 静态成员函数怎么引用该类中的非静态成员函数
最佳答案,感觉有些没说明白,是说静态成员函数调用了原类的普通成员函数拷贝构造函数和析构函数么?修改了下代码,大致可以看清:
#include<iostream>
using namespace std;
class Myclass
{
private:
int m; //非静态数据成员
static int n; //静态数据成员
public:
Myclass(); //构造函数
Myclass(Myclass &r); //拷贝构造函数
static int getn(Myclass a); // 静态成员函数
~Myclass(); //析构函数
};
Myclass::Myclass()
{
m = 10;
cout << "调用构造函数" << endl;
}
Myclass::Myclass(Myclass &r)
{
m = r.m;
cout << "调用拷贝构造函数" << endl;
}
Myclass::~Myclass()
{
cout << "调用析构函数" << endl;
}
int Myclass::getn(Myclass a)
{
cout << a.m << endl; // 通过类间接使用 非静态数据成员
return n; // 直接使用 静态数据成员
}
int Myclass::n = 100; // 静态数据成员初始化
void main()
{
Myclass app1;
cout << app1.getn(app1) << endl; // 利用对象引用静态函数成员
cout << Myclass::getn(app1) << endl; // 利用类名引用静态函数成员
system("pause");
}
这里还有个改来的例子,原例子是讲静态成员函数调用静态成员变量的。网址:网页链接
我在这里再构造一个普通成员函数,用静态成员函数调用它,碰到普通成员函数只能通过对象调用的问题,因此在静态成员函数中定义了一个默认值的对象(面积是0.不会计数图形个数),但是每次这个对象销毁后(即这个静态成员函数调用之后)系统会调析构函数,使图形计数减1,所以我在这里强行加1.最终编译运行是可以的,可以参考下。
#include <iostream>
using namespace std;
class CRectangle
{
private:
int w=0, h=0;
static int totalArea; //矩形总面积
static int totalNumber; //矩形总数
public:
CRectangle() {};
CRectangle(int w_, int h_);
CRectangle(CRectangle & r);
~CRectangle();
void PrintCRectangle();
static void PrintTotal();
};
CRectangle::CRectangle(int w_, int h_)
{
w = w_; h = h_;
totalNumber++; //有对象生成则增加总数
totalArea += w * h; //有对象生成则增加总面积
}
CRectangle::CRectangle(CRectangle & r)
{
totalNumber++;
totalArea += r.w * r.h;
w = r.w; h = r.h;
}
CRectangle::~CRectangle()
{
totalNumber--; //有对象消亡则减少总数
totalArea -= w * h; //有对象消亡则减少总而积
}
void CRectangle::PrintCRectangle()
{
cout << this->totalNumber << "," << this->totalArea << endl;
}
void CRectangle::PrintTotal()
{
CRectangle a;
/*cout << totalNumber << "," << totalArea << endl;*/
a.PrintCRectangle();
totalNumber++;
}
//必须在定义类的文件中对静态成员变量进行一次声明 //或初始化,否则编译能通过,链接不能通过
int CRectangle::totalNumber = 0;
int CRectangle::totalArea = 0;
int main()
{
CRectangle r1(1, 1);
CRectangle *r2 = new CRectangle(2, 2);
CRectangle r3(r1);
//cout << CRectangle::totalNumber; //错误,totalNumber 是私有
CRectangle::PrintTotal();
r2->PrintTotal();
r3.PrintTotal();
delete r2;
CRectangle::PrintTotal();
r1.PrintTotal();
r3.PrintTotal();
return 0;
}
再改一个版本,仿照最佳答案,在静态成员函数中参数可以是类的对象,则在函数中不再定义类的对象,直接使用对象调用类的普通成员函数。由于这样做在调用静态成员函数时会对类对象初始化,调用构造函数(调用拷贝构造函数),则会对面积加和,计数会加1,而此函数调用结束,还会调用析构函数,会将面积减小,计数减1,所以会在下面的一些函数中加一些处理。最终结果,和上面是对得上的。
#include <iostream>
using namespace std;
class CRectangle
{
private:
int w=0, h=0;
static int totalArea; //矩形总面积
static int totalNumber; //矩形总数
public:
CRectangle() {};
CRectangle(int w_, int h_);
CRectangle(CRectangle & r);
~CRectangle();
void PrintCRectangle();
static void PrintTotal(CRectangle a);
};
CRectangle::CRectangle(int w_, int h_)
{
w = w_; h = h_;
totalNumber++; //有对象生成则增加总数
totalArea += w * h; //有对象生成则增加总面积
}
CRectangle::CRectangle(CRectangle & r)
{
totalNumber++;
totalArea += r.w * r.h;
w = r.w; h = r.h;
}
CRectangle::~CRectangle()
{
totalNumber--; //有对象消亡则减少总数
totalArea -= w * h; //有对象消亡则减少总而积
}
void CRectangle::PrintCRectangle()
{
cout << this->totalNumber << "," << this->totalArea << endl;
totalArea += this->w * this->h;
totalNumber++;
}
void CRectangle::PrintTotal(CRectangle a)
{
totalArea -= a.w * a.h;
totalNumber--;
/*cout << totalNumber << "," << totalArea << endl;*/
a.PrintCRectangle();
}
//必须在定义类的文件中对静态成员变量进行一次声明 //或初始化,否则编译能通过,链接不能通过
int CRectangle::totalNumber = 0;
int CRectangle::totalArea = 0;
int main()
{
CRectangle r1(1, 1);
CRectangle *r2 = new CRectangle(2, 2);
CRectangle r3(r1);
//cout << CRectangle::totalNumber; //错误,totalNumber 是私有
CRectangle::PrintTotal(r1);
r2->PrintTotal(*r2);
r3.PrintTotal(r3);
delete r2;
CRectangle::PrintTotal(r1);
r1.PrintTotal(r3);
r3.PrintTotal(r3);
return 0;
}
上述代码还可以改成:
void CRectangle::PrintCRectangle()
{
cout << this->totalNumber << "," << this->totalArea << endl;
//totalArea += this->w * this->h;
//totalNumber++;
}
void CRectangle::PrintTotal(CRectangle a)
{
totalArea -= a.w * a.h;
totalNumber--;
/*cout << totalNumber << "," << totalArea << endl;*/
a.PrintCRectangle();
totalArea += a.w * a.h;
totalNumber++;
}
即,只在PrintTotal函数中处理面积和计数的变化。
如果上面程序中将拷贝构造函数去掉,则结果会出错。
㈦ 静态成员函数可以访问非静态成员变量吗
静态成员函数不能访问非静态成员变量,这是规定。 但是你可以换下解决问题的思路。线程的入口函数除了可以锁静态成员函数,也可是全局函数。 在全局函数里获取主窗口的句柄之后,接下来可以访问各种成员变量。
㈧ 静态成员函数是不是绝对不能访问本类中的非静态成员
是,因为编译器做不到。静态成员在非静态成员之前初始化。
㈨ 怎样让静态成员函数访问非静态成员变量
静态成员函数不能访问非静态成员变量,这是规定。 但是你可以换下解决问题的思路。线程的入口函数除了可以锁静态成员函数,也可是全局函数。 在全局函数里获取主窗口的句柄之后,接下来可以访问各种成员变量。
希望对你有帮助。