C++类
C++和java都是面向对象的语言,所以类的语法上看起来相似,但也有些区别,比如访问控制符的书写规范。除此之外,在访问控制权限,静态static等内容也有很大区别
1.访问控制权限
- 访问控制符
//不加的默认私有
class player {
int x, y;
int speed;
void move(int a, int b){
x += a * speed;
y += b * speed;
}
};
//加访问控制符
class player {
public:
int x, y;
int speed;
private:
void move(int a, int b){
x += a * speed;
y += b * speed;
}
};
- 访问权限的继承
---- C++访问权限符有三种,public-可以任何位置访问类成员;protected-可以在子类(派生类中)访问父类成员;private-只能在自己类中访问成员
----类继承也包括public、protected和private继承
class player : public person {
...
};
ps:类继承后,成员的访问权限其实产生了一种"降级"效应。就比如原先的private权限访问度已经很低了,无论哪种权限继承,private成员都只能在本类中被访问;而对于像protected权限是为了让子类能访问到父类成员,比他高的public继承或者private继承都不会影响原先的效果,而private继承反倒会让它“降级”——即原本在父类的protected成员,经过private继承后在子类中变成了private成员;同理public成员也可能被protected继承或者private继承所“降级”
- 对比java的权限访问符
相比较C++,java的访问权限符多了个default(缺省),并且各权限控制是针对包的管理。但java没有权限继承,这其实像是为了简化的一些骚操作,相似的规定就比如java也不能多继承(多继承就不能有super了)
static关键字的两种用法
-
在类或结构体内使用static关键字修饰成员或方法,就表示静态成员或静态方法
-
若是在类或结构体外部:若是静态全局变量,那这个全局变量就只声明在本cpp文件(翻译单元)中,且不能被别的extern导出;若是静态局部变量,那它的声明周期就相当于整个程序的声明周期,但作用范围被限制在本作用域内
-
同名的全局变量,则会导致重复声明的链接错误,要么通过static限制本cpp文件,要么通过extern外联其他同名全局变量
1.static解决
//a.cpp中
static int s_var = 5;
//main.cpp中
int s_var = 10;
int main(){
std::cout << s_var << std::endl;
}
//输出10
2.extern解决
//a.cpp中
int s_var = 5;
//main.cpp中
extern int s_var; //注意这里没有了赋值
int main(){
std::cout << s_var << std::endl;
}
//输出5
//这被称为 external linkage或external linking。