C++_11_类和对象 - 重写版
类和对象
基本概念:
类:在C++中,“类”是一种数据类型的蓝图(模板),不占用内存空间,关键字 ”class“
对象:对象是类的具体实现,是按照模板(类)做出的成品,占用内存空间
成员变量:类中定义的变量
成员函数:类中定义的函数
在类中不能对数据成员进行初始化,因为类不占有内存,无法给初始化数据分配内存
类成员:
类成员 | 派生类 | 对象 | |
private(私有成员) 开头省略默认私有 | 可访问 | 不可访问 | 不可访问 |
protected(保护成员) | 可访问 | 可访问 | 不可访问 |
public(公有成员) | 可访问 | 可访问 | 可访问 |
在类体中和类体外定义成员函数是有区别的:
在类体中定义的成员函数会自动默认成为内联函数(创建对象会把函数体粘贴过来),在类体外定义的不会。
内联函数一般不是我们所期望的,它会将函数调用处用函数体替代,所以一般我们在类体内部对成员函数作声明,而在类体外部进行定义,这是一种良好的编程习惯,实际开发中大家也是这样做的。但是当我们需要使用内联函数在类外定义的时候,实际上也可以直接将函数在类内定义,何必要再写个内联函数呢?
思考:类的成员函数在类内声明,类外定义的时候,一定要加”类名::“(范围界定符),与此同时调用成员函数必须先定义对象,在通过对象调用
但是有些同学善于钻牛角尖,他们有时候类外定义的时候没有使用范围界定符,并且没有定义对象,直接就调用出来了,这种情况,你调用的只是普通的函数,和类和对象已经完全没有关系了
/**
在类体中定义的成员函数会自动默认成为内联函数(创建对象会把函数体粘贴过来),
在类体外定义的不会
一般良好的编程习惯都是,类内声明,类外定义。
*/
#include<iostream>
using namespace std;
class MyClass
{
public:
//成员函数 在类内 声明 类外定义
void setNum(int data);
int getNum(void);
int ptfun(int ac); //普通函数,这样的声明是没有意义的
private:
int num;//4Bit
};
//-----------------------------------------
//MyClass类的成员函数
void MyClass::setNum(int data)
{
num = data;
}
int MyClass::getNum()
{
return num;
}
//-----------------------------------------
int ptfun(int ac); //普通函数的定义,放到这里就好!
int main()
{
MyClass B;
B.setNum(200);
cout << "num = " << B.getNum() << endl; //num = 200
ptfun(25); //output ac = 25
return 0;
}
//虽然也在类里面申明了,但是是无效的声明
//但是这是个普通函数,而不是类的成员函数
//------普通函数-----------------------------
int ptfun(int ac)
{
cout << "output ac = " << ac << endl;
return 0;
}
类的静态成员函数一般在类内声明,类外定义
类中的几种概念详解:
类成员函数 | 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。 |
类访问修饰符 | 类成员可以被定义为 public、private 或 protected。默认情况下是定义为 private。 |
构造函数 & 析构函数 | 类的构造函数是一种特殊的函数,在创建一个新的对象时调用。类的析构函数也是一种特殊的函数,在删除所创建的对象时调用。 |
C++ 拷贝构造函数 | 拷贝构造函数,是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。 |
C++ 友元函数 | 友元函数可以访问类的 private 和 protected 成员。 |
C++ 内联函数 | 通过内联函数,编译器试图在调用函数的地方扩展函数体中的代码。 |
C++ 中的 this 指针 | 每个对象都有一个特殊的指针 this,它指向对象本身。 |
C++ 中指向类的指针 | 指向类的指针方式如同指向结构的指针。实际上,类可以看成是一个带有函数的结构。 |
C++ 类的静态成员 | 类的数据成员和函数成员都可以被声明为静态的。 |
C++的三大特性:
封装:封装是将数据和方法(操作数据的函数)包装和隐藏起来,只对外开放接口,让外界无法直接访问和更改类内的数据和方法,只能通过某些特定的方式才能访问,这样能避免受到外界的干扰和误用,从而确保了类中的数据和方法的安全。
通常对于数据和方法封装(隐藏)的等级分为三个等级:private(私有)、protected(保护)、public(公有)
继承:继承通常是指使用一个类来创建另一个类的机制,通过继承机制,可以利用已有的数据类型来创建新的数据类型。新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。
派生和继承是一个机制,只是相对应的角度不同 父类—>子类 叫做“派生” 子类—>父类 叫做“继承”
多态:多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。不同功能的函数可以使用相同的函数名,这就是函数的多态,函数的多态也被称为函数重载,函数重载不一定可以被称为多态
C++l类中class和结构体struct区别和联系
相同:不论是struct还是class均是为了创建或封装出一个新的数据类型,所以在含义和语法上都是相似的
差异:成员范围:struct在C语言中struct只能定义数据,不能定义函数;但C++中进行了兼容升级,既可以定义数据成员,又可以定义成员函数 。
class在C++中使用,既可以定义数据成员,又可以定义成员函数
默认属性:struct声明中的默认属性均为public,在struct外部可以随意访问;class 中定义的成员变量或成员函数默认的属性是 private
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异