struct和class都是类的名称,区别是struct默认是public,class默认是private。权限一共是三种,publlic,private和protected。在c语言中struct只是结构体,不能存放函数,在c++中升级为类之后可以存放函数。看张图
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
c++中有三大特性,封装,继承和多态,而类和对象重点研究的就是封装
封装:将数据和操作数据的方式进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。封装本质上是一种管理,让用户更方便使用类。看下类的实际应用
#include<iostream>
using namespace std;
struct gym{
public:
int add(int a, int b) {
return a + b;
}
int getx(int m) {
x = m;
return x;
}
private:
int x;
};
int main()
{
gym res;
cout << res.add(1, 2) << endl;//输出3
cout <<res.getx(5)<< endl;//输出5
return 0;
}
注意,一般只能类中的函数才能使用private中的东西。在一般代码中有三个域,优先级从小到大是局部域,类域,全局域。因此下面这段代码中并没有用到private中的x,只使用到了局部域,也就是使用函数传参的x
struct gym{
public:
int getx(int x) {
x = x;
return x;
}
private:
int x;
};
注意类里面定义的函数默认是内联函数inline,函数太复杂就不会被认为是内联,这部分上次的博客有讲。
同时,类也可以将声明和定义分离,看个例子,这种方法在实际使用中也会经常用到
//头文件add1.h
struct kkk{
public:
int add(int a, int b);
private:
int t=6;
};
//源代码
#include<iostream>
#include"add1.h"
using namespace std;
int kkk::add(int a, int b) {
return (a + b) * 5+t;
}
int main()
{
kkk bb;
cout << bb.add(1, 2) << endl;//输出(1+2)*5+6=21
return 0;
}
看下什么是类的实例化,只有实例化对象才会占用空间
在验证一下在刚实例化一个类的时候,中间的所有东西都会创建并占有空间吗?
#include<iostream>
using namespace std;
struct gym{
public:
int add(int a, int b) {
return a + b + x;
}
int getx(int m) {
x = m;
return x;
}
private:
double y = 5;
int x=1;
};
int main()
{
gym res;
cout << sizeof(gym) << endl;//输出16
cout << sizeof(res) << endl;//输出16,说明设计图和设计图产生出来的房子大小是一样的
return 0;
}
结果证明对象中只存储成员变量,不存储成员函数,函数在不使用时并不占用空间!这里只计算了存储一个 int型和一个double型变量。至于为什么是16,请自行搜索如何计算一个结构体大小的知识,这里不再讲述。但是如果一个类没有成员变量,只有成员函数呢?会占1字节来证明它存在。
看下面这个情况,其实s1和s2调用的是一个地址的函数!
#include<iostream>
using namespace std;
struct gym{
public:
int add(int a, int b) {
return a + b + x;
}
int getx(int m) {
x = m;
return x;
}
private:
double y = 5;
int x=1;
};
int main()
{
gym s1;
gym s2;
cout<<s1.add(3,4)<<endl;
cout<<s2.add(3,4)<<endl;
return 0;
}