引用作为重载条件:
int fun(int n)
{
}
int fun(int &n)
{
}
以上两个函数是可以重载的,但是调用时可能会有冲突.!
冲突: fun(a);
不冲突: fun(23); ---> fun(int n)注意:const修饰不能作为重载条件
重载与默认参数:
int fun(int n1, int n2=2)
{}
int fun(int n1)
{}
可以重载的! 但是也要注意调用冲突. ----> fun(23);
一、类与对象
封装的思想:
将属性以及行为放置在一起来描述一个事物.就是封装的思想
属性或行为前还可以加以权限的修饰.(public,private,protected)
封装:
1.构造函数与析构函数
类似于手机需要有出厂设置,出厂设置会将最基本的东西进行初始化,保证后续的使用.-->构造
当你需要处理手机时,需要将你以前所有使用过的记录清理调用. ---> 析构
1、构造函数作用:
对成员属性进行初始化的函数,未初始化的属性值是未知,使用有危险性.
2、析构函数:
在对象空间即将被销毁之前,将对象中的成员属性进行释放(清理).
构造函数:
1. 编译器会自动进行调用,不需要手动调用. (编译器要求必须调用构造)
2.如果代码中没有构造函数,则编译器会自动提供(空实现!!!)
3. 构造函数定义方式:
1、函数名与类名一致
2、函数没有返回值,也不是void类型
3、可以有参数,意味着可以重载
调用时机:在实例化一个新对象时,构造函数会自动调用.
构造函数分类:
无参构造: 函数没有参数..
{
类名()
{
}
在实例化对象时,如果对象没有参数,则调用该构造. 例如: Hero h1;
}
带参构造: 函数设置一个或多个参数
{
类名(<参数类型> <参数名>.....)
{
}
如果有带参构造,则表示在实例化对象时,对象可以有参数. 例如: Hero h1("jy")
}
代码举例:
#include <iostream>
using namespace std;
class Hero
{
public:
Hero()
{
//这就是无参构造,用来初始化对象
}
Hero(string name,int num)//有参构造
{
s_name = name;
s_num = num;
}
private:
string s_name;
int s_num;
};
构造函数调用方式 :
Hero h1; ---> 调用无参构造 或 编译器提供的默认构造(编译器提供).
括号法:
Hero h1(2); ---> 调用带参构造. (常用)
显示法:
Hero h2 = Hero(2);
隐式转换法:
Hero h3 = 8; ---> 调用带参构造.(只能用于一个参数的构造)
析构函数:
1.编译器会自动进行调用,不需要手动调用. (编译器要求必须调用析构)
2.如果代码中没有析构函数,则编译器会自动提供(空实现!!!)
3.析构函数定义方式:
1、函数名与类名一致,但是在函数名前需要添加 ~ 符号. ~类名()
2、函数没有返回值,也不是void类型.
3、不能有参数,意味着不可以重载4、调用时机:在对象即将被销毁之前,析构函数会自动调用,用于清理成员属性
例如:
class Hero
{
public:
~Hero() //这就是析构函数
{
//用delete释放空间
}
};
拷贝构造:
调用时机:
1、利用一个旧对象初始化新对象时: Hero h2(h1);
2、函数对象以值方式传参时: void fun(Hero h1){}
3、函数以值方式返回局部对象时
拷贝构造: 该构造函数主要用于复制(拷贝)一个新的对象. (涉及两个对象:被拷贝对象,拷贝对
象)
类名(const <类名>& 对象1)
{
//将对象1的所有属性复制给当前对象.
}
例如:
Hero(const Hero &c_h)
{
}
匿名对象(临时对象)
没有名字的对象,匿名对象的空间会在当前语句结束后被释放!!
例如:有一个对象Person,
Person(2); //匿名对象,此行结束后空间将会被释放
new 关键字 (跟C语言中malloc有点类似)
new一个对象:
1.Hero *p_h = new Hero;
2.Hero *p_h2 = new Hero(56);
3.Hero *p_h3 = new Hero(*p_h);
构造函数使用规则:
编译器默认提供四个基本函数:
1. 默认构造函数(空实现)
2. 默认析构函数(空实现)
3. 默认提供拷贝构造函数(提供浅拷贝方式)
4. 提供对象赋值运算符重载
规则:
如果用户提供有参构造函数或拷贝构造,则编译器不再提供默认构造函数
如果只是提供了带参构造或无参构造,则编译器还是会提供拷贝构造.