一、动态创建对象
1.普通定义对象: class student {}; student danny(1,2)
2.动态创建对象: new的方式创建对象
第一种:缺省构造class student {}; student* pdanny = new student;
第二种:有参构造 class student { public: student(int a,double b){} };
student* pdanny = new student(1,1.0);
Pdanny->id = 123;
第三种: 创建数组 student* pdanny = new student[2];
3.注意:
动态创建的对象,一定要用delete释放,否则内存泄漏
对象和简单的数据类型没有区别,但new对象会调用构造,delete调用析构
二.类的静态成员和const成员
1.静态成员变量
定义:静态成员变量属于整个类,不属于某一个对象。
格式: 在变量前加static 。 例如 static int m_age ;
初始化:必须在类外初始化 (int box::boxNum = 5;)不可以在.h文件中初始化
使用: 第一种:通过对象.变量 的方式访问 danny.num = 10;
第二种: 通过类名冒号的方式访问: student::num = 10;
注意: 静态成员变量属于类,不属于某个对象,但可以用对象去访问
只要一个对象修改了静态成员变量的值,所有对象都发生改变
静态变量只有一份内存;不是每个对象多有内存;
静态成员变量不占用类的空间大小,所以sizeof(类名)中的大小是1
必须在类外初始化,不可以直接在静态成员变量后加等于号 ;
2.静态成员函数
定义: 静态成员函数也是属于类,不属于某个对象
格式: static 返回值 函数名(参数){} static加在函数最前面
注意: 实现和定义分离时候,实现不可以加static关键字
静态成员函数只可以使用静态成员变量;
静态成员函数中,不会自动添加this,但static属于类不需要this可以访问到;
静态成员函数可以通过对象.访问访问,也可以通过类名冒号方式访问;
静态成员函数只可以访问静态成员变量,不可以访问非静态成员变量
用来判断对象是否创建,用于单例模式(只可以创建一个对象)
3.const成员变量
定义:被const修饰的成员变量,不可以修改。
初始化:const成员变量必须初始化,在类内初始化,可以在声明的时候直接赋值。
第一种方式: 直接在定义成员变量时候进行初始化
const int m_age = 0;
第二种方式: 构造函数的初始化列表中,但不可以在构造的大括号中
stduent::stduent(int age ,int id):m_id(id),m_age(age){}
注意:需要添加c++标准 g++ 02main.cpp 02const.cpp -std=c++11
4.const成员函数
定义:const关键字写在函数参数列表后,声明和实现都必须加const
作用: const成员函数不可以修改成员变量的值
格式: void stduent::show(int a,int b)const { } 函数最后添加const
注意事项:
Const成员函数和非const成员函数构成重载
非const函数可以调用const成员函数,const成员函数不可以调用非const函数
非const对象(指针)优先调用非const成员函数,没有非const则调用const函数
Const对象优先调用const成员函数。不可以调用非const成员函数
const成员变量: 在定义类的时候,成员变量前加const ;const int m_age = 10;
Const成员函数:定义类时,在函数后加const; void fun()const;
Const对象: 在定义对象时,在前面加const, const student danny;
三、友元
1.友元函数
定义在类外,但可以访问类中的所有成员变量(包括私有,共有和保护)
注意:尽管友元函数在类中声明,但不属于类,也就不属于对象,也不是成员函数
友元函数可以理解成全局函数,可以通过对象访问私有成员
友元函数没有this指针,因为不属于类。
友元函数中定义的局部变量,不可以在类中的成员变量中使用。
友元函数只可以在类中声明,不可以在类外。
友元函数可以在类外实现,不需要加类限定符。
格式: 在类中,函数名前加friend ,但需要传入当前类的对象才能操作成员变量;
2.友元类
定义: 定义一个类是其他类的友元,则友元类可以访问原类的所有成员和方法
例如: class a{int x; int y; int z; friend class b; }; class b{int danny; int age;};
注意: 在b类中访问a类的成员变量,需要用对象的方式
b是a的友元则a不是b的友元,说明b可以访问a的私有成员和方法
b中可以使用a的友元函数;因为友元时全局函数;
四.运算符重载
1.函数重载:在同一个作用域内,函数名相同参数列表不同的多个函数
2.运算符重载: 也是重载,和函数重载相类似,但运算符前需要加operator;
例如: 如下代码Student a ;student b; if(a > b){} 有错误,编译器不知道怎么比较
3.运算符汇总:
算数运算符: + - * / %
关系运算符: > < >= <= == !=
逻辑运算符: && || !
二进制运算符: & | ~ >> << ^
赋值运算符: += , >>= , =
三目运算符: ?:
自增减运算符: ++ --
内存申请: new delete
特殊运算符: () . -> , [ ] #
大小运算符: sizeof()
流运算符 : >> <<
不可以重载运算符: 三目运算符(?:)
点运算符(danny.x)
作用域运算符(student::fun())
计算大小运算符(sizeof())
#号运算符
->* .*
4.格式: int operator+(对象的引用) ;
注意: 运算符重载中,原本的属性不可以改变,(单目,结合方式)
大部分的运算符重载都有三种方式,全局函数,友元函数,成员函数实现