2——of C++ class relative

发布时间 2023-10-16 22:41:02作者: JayerListen

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。

this(and super-java单继承才有)