seo sem 外贸建站 网站建设 文化墙设计,哈尔滨城市建设局网站,互联网金融网站设计,企业营销网站开发建设专家目录 1. 类与对象1.1 引子#xff1a;结构体与类1.2 什么是类#xff08;类的定义方式#xff09;1.3 类和结构体的区别1.4 类的访问限定符与封装1.4.1 访问限定符1.4.2 类的作用域与类的实例化 1.5 类对象的模型1.5.1 类内部资源的存储方式1.5.3 类大小的计算方式 1.6 this… 目录 1. 类与对象1.1 引子结构体与类1.2 什么是类类的定义方式1.3 类和结构体的区别1.4 类的访问限定符与封装1.4.1 访问限定符1.4.2 类的作用域与类的实例化 1.5 类对象的模型1.5.1 类内部资源的存储方式1.5.3 类大小的计算方式 1.6 this指针1.6.1 this指针的引入1.6.2 this指针的特性 1. 类与对象
1.1 引子结构体与类 在C语言中我们学习过自定义类型结构体其内部可以创建自定义类型的变量与内置类型的变量来满足我们的需要。结构体的产生是为了描述简单内置类型无法定义的复杂对象。我们知道计算机是帮着人们解决现实世界问题的工具将问题使用编程语言描述出来并传递给计算机来进行解决为了更好的贴近现实生活由此有了结构体的概念。当我们引入面向对象的概念C初阶之后结构体已经无法满足我们的需求为了更好的解决问题我们引入类与对象的概念。 1.2 什么是类类的定义方式 定义方式类名关键字Class 类名 类体成员变量 类方法 访问限定符 class [这个类的名称]
{
public://类的成员变量
private://类方法
};补充C中成员变量命名方式 注类的内部方法可以直接访问类的成员变量 class Date
{
private:int year;int month;int day;public: void Init(int year){//无法正常赋值year year;}
};上述操作会导致命名冲突编译器无法识别发生错误所以建议类的成员变量前都加下划线_ class Date
{
private:int _year;int _month;int _day;
}类方法的声明与定义分离 //class.h
class Date
{
private: int _year;int _month;int _day;
public:void Print();
}//class.c
void Date::Print()
{cout _year - _month - _day endl;
}类方法声明与定义方式分离的方式可以提高代码的可读性在类内部定义的方法会被默认为内联函数 1.3 类和结构体的区别 当我们分别使用类与结构的方式定义栈两者有何差异。C语言中的结构体 结构体
//定义方式
struct Stack
{int* _data;int _capacity;int _top;
};void StackInit(Stack* stack)
{stack-_data NULL;stack-_capacity stack-_top 0;
}//调用方式
struct Stack stack1;
StackInit(stack1);类
//定义方式
class Stack
{
public:int* _data;int _capacity;int _top;void Print(){cout _capacity endl;}
};//调用方式
Stack stack1;
stack1.Print();定义方式与内部结构 结构体内部只能定义变量而类还可以定义方法类有访问限定符决定其内部成员变量是否可以访问只有public的情况下可以访问 调用方式 创建变量时结构体类型的全名为struct 结构体名而类只需要使用Class关键字之后的类名类可以直接调用类方法而结构体只能将自己作为参数传参给指定函数 注上述区别为C语言中结构体与类的区别在C中对这一方面有了调整与补足C结构体中也可以定义方法使用时也可以省略关键字struct 1.4 类的访问限定符与封装 面向对象三大特点封装继承多态 1.4.1 访问限定符 公有public类外可以直接访问私有private类外无法访问保护protect类外无法访问 注访问的限定符的作用域为从限定符开始到下一个限定符/类的末尾结束 访问限定符的作用与存在意义 对类内部资源进行访问与操作权限区分提高了内部资源的安全性隐藏了类实现的细节方便数据的管理使得对类的使用变得简单因为有访问限定符对类内部资源权限的不同划分由此而实现了对类的封装 1.4.2 类的作用域与类的实例化 类体内是一个独立的作用域其内部的所有成员在类的作用内而在类内部声明外部定义的成员在定义时需要声明类域如此才能够访问类内部的资源。 class A
{
public:int _a;void Print();
};void A::Print()
{cout _a endl;
}我们自定义类的使用与结构体自定义类型的使用类似同样为类型 创建对象名变量的定义方式类的实例化我们定义的类并非实体只是一个抽象的模板如果将类实例化出的对象比作具体现实存在的高楼那么类就是这些高楼的建筑图纸 class B
{
public:int _b;void Print(){cout _b endl;}
}//实例化方法
B b1;
//访问实例化对象内部成员的方式
b1._b 10;
//调用内部方法的方式
b1.Print();1.5 类对象的模型
1.5.1 类内部资源的存储方式 我们通过上面的学习了解到类是由两部分组成的成员变量 成员函数我先通过简单控制变量的方式来初步分别查看两者存储方式。 成员变量 class A
{int _a;
};cout sizeof(A) endl;增加成员函数 class A
{int _a;void Print(){cout _a endl;}
};cout sizeof(A) endl;通过上述尝试我们不难发现成员函数的增加并没有使得类的大小增加所以成员函数并没有存储在类的内部 1.5.3 类大小的计算方式 类内资源的存储方式 成员函数不存储在类的内部在类内声明定义的函数实则定义在类外在类内的声明定义更类似一个声明的操作声明此函数为这个类的成员函数类的成员变量存储在类的内部遵循内存对齐的规则C语言结构体 class C
{};特殊的空类的大小并不为空而是会有一个字节来标识其的存在 1.6 this指针
1.6.1 this指针的引入 经过学习我们知道成员函数的定义并不在类中那么成员函数是怎么分辨是哪一个实例化对象在调用它又是如何访问实例化对象的成员变量呢这里我们引入类成员函数中的一个隐藏参数this指针在C中其实编译器给每个非静态成员函数在定义时都赋予一个隐藏参数this指针该指针会默认指向调用它的实例化对象我们对于实例化对象中成员变量的访问其实都是通过它来实现的 1.6.2 this指针的特性 this指针的类型为自定义类的指针A*const这代表着此指针无法改变指向不允许被修改this指针只能够在成员函数的内部使用this指针本质上是函数的形参并不存储在类的内部this指针是“成员函数”第一个隐含的指针形参一般情况由编译器通过ecx寄存器自动传递 class A
{
public:int _a;void Print1(){cout _a endl;}void Print2(){cout this-_a endl;}void Print3(){cout *this._a endl;}
}//三种调用方式本质相同
A a1;
a1.a 10;
a1.Print1();
a1.Print2();
a1.Print3();注 C中类的实现方法在本质上与C中结构体的实现并无不同只是C语言这些细节与过程需要我们自己调控而C中会由编译器来代为维护完成。C中还给类添加了访问限定符对类进行了封装提高了资源的安全性便利了我们的使用