目录
前言
本文讲的是c++中的类与对象,不同于c语言的结构体,类与对象会在我们后面的学习中更高频地出现。
一.类的引入
在C语言中结构体只能定义变量。
#include <iostream>
using namespace std;
struct stack
{
int* a;
int top;
int capacity;
};
void stackinit(struct stack* ps);
而在C++中结构体不仅能定义变量还能定义函数。
#include <iostream>
using namespace std;
struct stack
{
int* a;
int top;
int capacity;
void Init(struct stack* ps)
{
int top = 0;
///
}
};
而且函数命名也不会像C语言那样严格,毕竟不是全局变量。在C++中每一个结构体都属于独立的一个域,所以在里面命名函数时不用担心与其他域的函数重名,二者不会构成重载函数。
二.类的定义
在C++中更喜欢用class去代替struct,其实二者并无太大差别。
class className
{
//类体:由成员函数和成员变量组成
};
类的两种定义方式:
- 声明和定义都放在类中
class A
{
void fun()
{
cout << a << b << endl;
}
int a;
int b;
};
这种方式会让编译器默认里面的函数是内联函数。
- 类声明放在.h文件,成员函数定义放在.cpp文件,注意:成员函数前需要加类名::
//A.h
class A
{
void fun();
int a;
int b;
};
//A.cpp
void A::fun()
{
cout << a << b << endl;
}
归根结底就是我们要在struct的基础上熟悉里面可以直接加入函数即可。
这二种方法前者适合短小函数定义或进行小测试,后者更常用于函数定义不短,工作时更规范一些。
成员变量命名规则建议:
class A
{
void fun(int year, int month, int day)
{
year = year;
month = month;
day = day;
cout << year << month << day << endl;
}
int year;
int month;
int day;
};
当遇到成员变量与函数形参命名相同时,我们还能否分清二者区别?
一般情况下在函数内部会采用局部优先原则,那么红色的year就变成形参了,这样不就混乱了嘛~
所以为了能很好区分二者,提高代码可读性。我们一般会对类所在的成员变量添加独特的标识。
class A
{
void fun(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
cout << year << month << day << endl;
}
int _year;
int _month;
int _day;
};
三.类的访问限定符
类有三种访问限定符
- public——公有
- protected——保护
- private——私有
访问限定符说明
顾名思义,由public修饰的区域类内部可以访问,外部也可以访问。
而protected与private现阶段来说二者功能差不多,所修饰的区域中外部无法访问,只能在内部访问。
而如果没有特地标明它们,在class中里面默认都为private,在struct中里面默认都为public。
class A
{
public:
void fun(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
cout << year << month << day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
A a;
a.fun(1,2,3);
return 0;
}
四.类的实例化
变量的声明与定义的区别就在于看它有无开空间,其实本质就是有无实例化。
class A
{
public:
void fun();
private:
int _year;
int _month;
int _day;
};
那么在A类中定义的成员变量是声明还是定义呢?——是声明,并没有开空间。
这也解释了为何为何不能直接在类里对成员变量赋值,例如:A:: _year = 1,因为赋值前提是要实例化,没有空间是没办法赋值的。
class A
{
public:
int _year;
int _month;
int _day;
void fun()
{
cout << _year << endl;
}
};
int main()
{
A a;
A b;
a._year = 1;
b._year = 2;
a.fun();//1
b.fun();//2
return 0;
}
总的来说,类就像是一张设计图(抽象化的概念),而对象就是靠设计图才设计出来的房子(真正有空间的实体)。一张设计图可以设计出多种类似的房子,所以类与对象是一对多的关系。而其中的赋值可以理解为对房子内部进行装饰,每座房子的装饰风格都可以有所不同。
五.计算类对象的大小
问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?
class A
{
public:
void fun()
{
}
private:
int _year;
};
int main()
{
printf("%d", sizeof(A));//4
}
当类中既有成员变量也有成员函数时,类的大小似乎只包含了成员变量。我们再进一步验证~
class A
{
public:
void fun()
{
}
};
int main()
{
printf("%d", sizeof(A));//1
}
仅有成员函数时,结果变为1.
class A
{
};
int main()
{
printf("%d", sizeof(A));//1
}
当什么都没有时,结果反而是1.这里的1只不过是用来表示空类的一种手段,表示就算没有成员变量,但作为空类也至少存在过~
最后我们得出结论,成员变量是存储在对象里面的,而成员函数则不然。其实这也很好理解,成员变量就是房子(对象)里的物品,而这些都是独立私有的。但成员函数就相当于是篮球场,它并不是通过房子(对象)而生成的,它是公有的,不同对象都可以进行使用。因此成员函数并不存储在对象中。