类和对象(上篇)
类和对象
- 面向过程和面向对象的区别:
- 结构体变为类
- 类的一些性质
- 类的访问限定符
- 类的实体化
- 类对象的大小
- this指针
面向过程和面向对象的区别:
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。
结构体变为类
C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
比如用C语言的结构体写一个栈,成员变量和函数是分离的
struct Stack
{
int* a;
int capacity;
int size;
};
void Init(struct Stack* p);
void push(struct Stack* p);
而C++来定义栈的时候,结构体里面也可以定义函数,且在不对结构体重命名的情况下,在定义结构体变量的时候也可以省了前面的struct
typedef int DataType;
struct Stack
{
//函数可以写在结构体的里面
void Init(size_t capacity)//接收的时候也不需要定义一个指针接收结构体变量的的地址,因为有一个默认指针thiS来接收
{
_array = (DataType*)malloc(sizeof(DataType) * capacity);
if (nullptr == _array)
{
perror("malloc申请空间失败");
return;
}
_capacity = capacity;
_size = 0;
}
void Push(const DataType& data)
{
// 扩容
_array[_size] = data;
++_size;
}
DataType Top()
{
return _array[_size - 1];
}
void Destroy()
{
if (_array)
{
free(_array);
_array = nullptr;
_capacity = 0;
_size = 0;
}
}
DataType* _array;
size_t _capacity;
size_t _size;
};
int main()
{
Stack s;//可以省去前面的struct
s.Init(10);//且调用函数的时候不在是传结构体变量的指针,而是用结构体变量点函数;
s.Push(1);
s.Push(2);
s.Push(3);
cout << s.Top() << endl;
s.Destroy();
return 0;
}
此外它也可以申明和定义分离,但是要注意的是,他的作用域,定义的函数要用 结构体名::函数
来实现才能找到这个结构体里申明的函数
当然在声明和定义分离的情况下,.h文件中也可以出现函数的定义。
到了这里我们就可以把结构体变成类了
类的一些性质
所以在C++中我们定义成员变量的时候一般在前面加一个—
class Date
{
public:
void Init(int year)
{
_year = year;
}
private:
int _year;
};
类的访问限定符
public:公有
private:私有
protected:保护
当前阶段我们认为私有private和保护protected没有区别
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
3. 如果后面没有访问限定符,作用域就到 } 即类结束
class的默认访问权限为private,struct为public(因为struct要兼容C)——这也是struct和class的一个重要区别
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
类的实体化
类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没
有分配实际的内存空间来存储它;
只有把类实例化为一个个对象,然后通过这个对象才能访问类中的值
类和对象是一对多的(设计图和房子)
类对象的大小
一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐
注意空类(无成员变量)的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象(表示他存在过)
this指针
C++里影藏的形参指针this
实际上是这样的,只不过C++编译器帮我们做了,所以我们不可以写出来
不过这里是可以写出来的
所以在调用类的的成员函数的时候,是不需要把对象的&地址写在实参里的,只需要对象名.函数,所以,函数的形参是影藏了一个this指针的。
因为对象的大小只有成员变量的大小,所以this指针的大小是不可能存在对象里面的。是存在栈帧上面的。