提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
1.C++中class和struct
在C++中引入struct是为了保持对C程序的兼容,在引入之后C++对其进行了扩充,现在struct和class一样都拥有静态成员、成员数据可进行初始化、拥有函数、也可以继承、甚至多态也支持。那么二者之间有什么区别呢?
1.1默认权限不同
struct A
{
int data;
};
此时结构体A中数据data的默认访问权限是public,class中为private
struct B : A
{
};
struct默认继承方式是public,class是private
1.2 struct不能定义模板参数
template<class T>
struct A
{
void func(T t)
{
cout << t << endl;
}
int data;
};
struct不能用来定义模板参数,但是仍可以使用模板
2.指针和引用
指针是变量,存储的是地址,可以初始化为NULL,存在多级指针; 引用是别名不能为空,必须初始化,并且初始化后不能改变,不能指向其它,引用的本质仍是指针。
double a = 5.0;
double* pa = &a;
double& ra = a;
cout << a << *pa << ra << endl;
cout << &a << endl;
cout << sizeof(pa) << endl;
cout << sizeof(ra) << endl;
参数返回值尽可能by reference,但当返回函数内部动态开辟的内存或对象时不能使用by reference,此时可能会导致内存泄露。
#include<iostream>
using namespace std;
class A
{
public:
A(int a = 0) :data(a) {}
~A() {}
private:
int data;
};
A& func()
{
A* a = new A(10);
cout << a << endl;
return *a;
}
int main()
{
A& b = func();
cout << &b << endl;
delete &b;
return 0;
}
此时b是函数内部(*a)的别名,函数结束后就将(*a)所在空间还给了系统,但是内容并未改变(所以仍可以通过b访问函数内部申请的内存空间),其实系统已经可以重新分配该地址。由于程序比较简单,所以未出现异常。
|