C++中struct和class的区别
struct是c语言中就存在的,并且struct中的成员都默认为public的。class是C++引入的概念,并且成员都默认为private的。
类的定义方式
class A //class + 空格 + 类名 + {};
{
private:
int a;
char c;
public:
//无参构造函数
A()
{
this->a = 0;
this->c = '\0';
}
//有参构造函数
A(int a, char c)
{
this->a = a;
this->c = c;
}
};
定义方式很简单,如上。需要注意的是 “}” 的后面一定要跟一个 “;”,否则会导致编译失败,而如Java等其他一些语言则不需要跟这个 “;”。
并且一般建议令成员变量被private修饰,成员函数则根据其功能考虑要用public还是private修饰。
public(公用):权限范围最大,在任何地方都可以访问到该作用域下的成员。
protected(保护):权限范围第二大,类内以及子类可以访问到该作用域下的成员。
private(私有):只有本类可以访问该作用域下的成员,类外和子类都不能访问该作用域下的成员。
构造函数的自动生成
C++中的类会默认包含一个无参构造函数,这个默认包含的无参构造函数不包含语句。
需要注意的是如果我们自己写了一个有参构造函数,则该类不会包含无参构造函数,需要用到无参构造函数的话则需要自己再写一个。
缺省构造函数和默认构造函数
如果一个类内同时存在全缺省构造函数和无参构造函数则会发生调用歧义,此时会发生编译错误,编译器也会直接报错。
#include <iostream>
using namespace std;
class A
{
private:
int a;
char c;
public:
//无参构造函数
A()
{
this->a = 0;
this->c = '\0';
}
A(int a = 1, char c = '1')
{
this->a = a;
this->c = c;
}
//有参构造函数
A(int a, char c)
{
this->a = a;
this->c = c;
}
void print()
{
cout << a << '\n' << c;
}
};
int main()
{
A* a = new A();
a.print();
return 0;
}
比如上面的这串代码,在vscode上会无法编译。
析构函数的使用
如果该类没有使用到堆区的内存,一般就不用编写析构函数。由于堆区的内存是由程序员手动开辟并手动释放的,在类内使用到堆区的话就一定要编写析构函数来完成这项任务,否则会发生内存泄露。
class A
{
private:
int a;
char c;
int *p;
public:
//无参构造函数
A()
{
this->a = 0;
this->c = '\0';
this->p = new int(5);
}
//析构函数
~A()
{
delete this->p;
p = NULL;
}
};
析构函数的写法就是就是在无参构造函数前加一个 “~” 。