1.作用域
1.块作用域
{//块
}
2.函数作用域
void test()
{
//函数
}
3.类作用域
class Name
{
//类
};
4.文件作用域
//全局
int g_global = 0;
2.可见性
标示符相同的局部覆盖全局的
3.对象生存期
1.静态生存期
程序编译的时候分配内存,运行结束时释放。
例子:全局、static修饰
- 全局的没有作用域限制,编译的时候只执行一次 int g_global = 0
- static 受到作用域的限制只在声明的作用域范围内有效,编译只执行一次 {int static s_i = 0;},以后每次调用 int static s_i=0都不再被初始化
2.动态生存期
执行完所在作用域及释放
例子:{int i = 0;}
执行完 释放 i
4.类的静态成员
使用:同一类中不同对象共享数据,static 修饰
1.静态数据成员
class Name
{
private:
static int s_;
};
int Name::s_ = 0;
2.静态函数成员
1.不能访问非静态的对象,通过传递参数可以访问
2.函数里的变量自动变成静态的
class Name
{
public:
static int getC();
};
int Name::getC(){}
//调用
Name::getC();
5.友元类
一个类主动声明那些函数和类是它朋友,给他们提供特殊的访问权限(private)
1.友元函数
在类中用 friend 修饰的非成员函数
class Name{
public:
//不是类的成员函数,是友元函数
friend float dist(Name &name);
private:
int x;
};
float dist(Name &n)
{
//可以访问类的私有成员 x
}
2.友元类
A类是B类的友元,A 里可以访问B的private、protected成员
class B{
friend class A;
private:
x
}
class A{
//可以访问 B 的私有和保护成员
}
注意
- 友元关系是不能传递的(A是B的,B是C的,A和C没用关系)
- 友元是单向的
- 友元关系不能被继承
6.数据共享与保护
要共享又要防止被改变,const 修饰
1.常引用
常引用做形参不会改变实参值
例子:
void display(const float &x){
//这里不能改变 x的值
}
int a = 9;
display(a);
注意:引用传递的必须带有地址
display(5)错误调用
2.常对象
常对象必须进行初始化,而且不能被更新。
例子:
class A{
public:
A(int x){ax = x;}
int ax;
}
A const a(2);
注意:常对象的数据成员不能被改变,而且只能调用常函数成员
3.常成员函数
一个对象对应一个常函数成员
class A{
void print(){cout<<"aa";}
const void print(){cout<<"bb";}
};
A a;
a.print();//输出 aa
const A b;
b.print();//输出 bb
//函数重载
注意:
- 不能更新数据成员,也不能调用不是const修饰的函数成员
- 常对象只能调用常方法
- const可用于重载函数的区分
4.常数据成员
一个对象对应一个常数据成员
class A{
public:
static const int p;
};
const int A::p = 0;
注意:常静态数据成员类外进行声明和初始化
class A{
public:
A(int x);
const int &xx;
//或者 const int xx;
};
//只能这样初始化?
A::A(int x):xx(x) {
//xx = x不行两种初始化的不同
}
注意:这两个有什么区别?
7.extern
修饰的函数或变量必须是全局的,static不行
1.外部变量
不同文件共用一个变量
//文件1
int i=5
//文件2
extern int i;
void print()
{
cout << i << endl;//i=5
}
2.外部函数
实际应用:微博、微信、QQ分享
//main.cpp
void myMain(int x){
cout << x << endl;//输出 5
}
//File.h
extern void myMain(int x);
//File.cpp
{
//调用 myMain,执行 main.cpp的此方法
myMain(5);
}