class

C++ 类与对象特性详解
1、类(class)说明:
类是由结构体进化而来,除了关键字使用class外类和结构体还有以下区别:
a、class除了对成员变量管理外还新增了成员函数,在C语言中struct不可以有成员函数。
b、class新增了权限管理,在C语言中struct连public的关键字也不能识别。
c、class新增的友元是对成员变量的开辟一种特殊的权限。
d、class新增了静态成员变量,当然函数也有静态成员函数。struct对于静态和成员变量都支持。
以上区别是针对C编译器中的结构体的对比。实际上,类和结构体在C++编译器中几乎完全一样
。只有成员缺省权限不同,struct缺省是公有权限,class缺省是私有权限
2、类的声明和定义:
a)把类的成员函数的定义和声明分开,成员函数的定义在外部编写:
b)成员函数的声明,如同在C语言中把所有函数声明都写在上面当做函数目录使用。
c)C++常常把类的声明写在一个头文件.h中,把成员函数的定义写在。CPP中。
d)在VC编译器中,可以选择“New Class”的菜单新建类,自动会生产成一个.h和一个.cpp文件。
例如:
class CAdd  
{
public:
void Test(int a);
CAdd();
virtual ~CAdd();


};


3、静态成员变量:在公司里的C++程序设计禁止使用全局变量和全局函数,而改用(静态)类成员变量
a)普通的成员变量,每定义一个类对象该成员变量都跟对象一起申请新的空间。
b)即在内存中只有一份空间,静态数据成员的生存期为整个程序运行期。
c)在类内只是一个声明(无空间),静态数据成员必须在类体外进行定义和初始化。
d)静态成员变量在进入main函数之前已经执行了定义有了空间,而普通成员只有在对象定义时才有空间。
3、静态成员的定义和调用:
a)声明:在类内定义变量时前面加static.
b)定义:在类外定义相同的类型和变量名,前面加定义域(::),而且要去掉static关键字。
c)普通成员变量的调用必须通过类对象调用,以上方法对静态成员变量调用也适用。
d)静态成员变量的调用可以跟对象无关,直接适用类名访问,普通成员变量就不可以。
通常用 类名::静态成员名 的形式访问
4、静态成员函数:
a)普通成员函数中都有一个隐含的形参(this)
b)静态成员函数不含有this参数
c)普通成员函数在调用时必须要用对象调用
d)静态成员函数可以使用对象调用,也可以直接用类名调用。
e)静态成员函数中不可以调用其他普通成员,只能调用本类或者其他类的静态成员。
f)普通成员函数可以调用静态成员(变量和函数)。


注意:静态成员代替全局函数和全局变量来使用的结果是:所有的变量和函数都被归为一个类内。
5、友元(friend)函数:其他函数或者类也能够访问某个类内的非公有成员,给予特权访问。
a)全局函数开放:friend void Test(CTest* p);
b)对整个类所有成员函数开放:friend CAAA;
c)对类内的单个成员函数开发:void CAAA::Test();




面向对象的主要特性:
抽象(Abstraction) :把具体事务转换为代码组织的过程
封装(Encapsulation):封装和隐藏对外可以访问,内部代码组织隐藏起来。
如同电视和电脑对外只显示开关频道等按钮,内部主板和元器件是封装起来的。
继承(Inheritance):对代码复用起作用,继承父类的功能。
多态(Polymorphism):在特殊情况下使用。
MetaClass元类本质也是一个类,但和普通类的用法不同,它可以对类内部的定义(包括类属性和类方法)进行动态的修改。使用元类的主要目的就是为了实现在创建类时,能够动态地改变类中定义的属性或者方法[^1]。 在Python里,使用metaclass时,一种常见做法是使用接口类。具体做法为创建metaclass,然后创建一个普通的`class Interface`作为接口`class` ,这个`Interface`则直接使用metaclass。这样做既可以获得metaclass的功能,又可以尽量保持接口稳定,并且把metaclass作为内部细节进行隐藏。接口稳定指的是用户创建新类时始终继承`Interface`,不需要更改;而开发者若创建了新的metaclass,只需要修改`Interface`,让`Interface`使用最新的metaclass即可。另外,在使用metaclass的接口类时,如果还要继承基类,则应该用接口类来继承基类,即写成`class SlotInterface(Parent, metaclass=AutoSlotMeta)`的形式[^3]。 实际开发中,像Django中定义`model`、`form`时,可以定义metaclass的属性,其实就是Django的ORM使用了metaclass的编程方式,不过其实现较复杂 [^4]。 同时,`__init__`和`__call__`方法在metaclassclass中使用时有所不同:在metaclass中,`__init__`对继承该metaclass的子类(子类相当于metaclass的实例)进行初始化(初始化类属性),`__call__`获取继承该metaclass的子类创建实例时的参数,然后调用子类的`__new__`和`__init__`方法对子类进行实例化和初始化(这里指创建子类实例对象);在class中,`__init__`用来对`__new__`创建的对象进行初始化(初始化对象属性),`__call__`用来声明该类的对象是可调用的 [^5]。 ### 示例代码 ```python # 定义一个元类 class MyMeta(type): def __new__(cls, name, bases, attrs): # 动态修改类属性 attrs['new_attribute'] = 'This is a new attribute' return super().__new__(cls, name, bases, attrs) # 使用元类创建类 class MyClass(metaclass=MyMeta): pass # 验证新属性是否添加 print(MyClass.new_attribute) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值