为什么要有静态成员?
全局变量可以实现数据共享,但是处处不可见,不安全---->静态成员可以实现一个类的所有对象的数据共享。
static特点:
- 声明在类内;但是初始化赋值必须在类外(静态成员函数的实现在类内外皆可以),并且不需要加static,但是必须指明为哪一个类的;
- 静态成员不占用类对象内存;
- 静态成员为所有对象所共有,不单独属于某一个类对象
- 静态成员函数可以访问私有成员
其他几个总结(包含c语言):
- static修饰局部变量,生存周期为函数运行期间,作用域为本函数内
- static修饰全局变量或者函数,表示它所修饰的内容对其他文件不可见
- 当它修饰一个类的成员变量时,表示它所修饰的这个变量为这个类的所有对象所共有;
- 静态成员函数只能操作静态数据;
- 非静态成员函数既可以操作静态也可以操作非静态数据
友元函数
作用:授予某个对象访问本类所有成员的权限
某个对象指:
1.普通函数(友元函数)
2.另一个类中成员函数(友元成员函数)
3.另一个类(友元类)
通常格式为:
friend 被授予权限的函数原型;
friend int main ();
friend void :A:fun();
friend class A(所有成员函数皆为友元函数)
没有this指针的情况
this指针见这里https://www.jianshu.com/p/07b3e236054d;
- 当使用static修饰一个类的成员函数时候,此函数不会传入一个隐含的this指针;
- 使用友元函数重载,将不存在隐含的this指针,需要在参数列表里面给出所有操作数.
静态成员函数一个例子
// staticTest.h文件
#pragma once
class staticTest
{
public:
staticTest();
~staticTest();
static int a;
};
// staticTest.cpp文件
#include "stdafx.h"
#include "staticTest.h"
staticTest::staticTest()
{
}
staticTest::~staticTest()
{
}
static void f() {
printf("static函数测试1");
}
void f1() {
f(); //此处可以调用f函数,没有报错,因为f1与f在同一个cpp文件里面
}
//main.cpp文件
// static测试.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "staticTest.h"
int main()
{
f(); //此处会报错,未定义标识符f,因为在.cpp文件里面用static修饰全局//变量或者函数,其他文件不可调用
getchar();
return 0;
}
一个变量或者说一个函数在声明时把给它添加了一个关键字static, 对于全局变量, 这个全局变量就不能被其它文件使用; 对于局部变量,则使得它的生存周期变得和全局变量一样长, 但作用域保持不变,
这里的文件指的是:那些包含有可执行代码的文件,不仅仅限于.h或是.cpp, 有函数定义的文件都是; 使用者最终被落实在一条语句中, 语句只能在函数内部出现,要想实现static的这种功能,不要把static修饰的变量或者函数写在头文件里面,直接定义在对应的.cpp文件里头即可,因为一般要把头文件包含了,所以static这个特殊功能可能实现不了. (用static修饰函数或全局变量的时候, 这些函数或全局变量就不要放在头文件了,只要写在相应.cpp文件中),具体参见上面这个例子;
网友评论