c++重点语法汇总(2)

版权声明:版权所有,违权必究!!! https://blog.csdn.net/IT_SoftEngineer/article/details/82941132

构造函数

  • 在定义类的对象时,系统会自动调用构造函数来创建并初始化对象

  • 构造函数的申明和定义

    1. 在类体内需要声明构造函数,形式如下:类名 ([形式参数列表]);

    2. 在类体外定义构造函数的形式如下:类名::类名([形式参数表]){函数体}//其实现部分可以在类体内实现

    3. 这里的形式参数允许带默认值,若构造函数在类体内实现,则去掉前面的类名::限定符

  • 构造函数具有以下性质:

    1. 构造函数的函数名必须与类名相同,以类名为函数名的函数一定是构造函数

    2. 构造函数没有返回值类型,前面一定不能添加void

    3. 构造函数为public属性,否则定义对象时无法自动调用构造函数,编译时会出现错误

    4. 构造函数只有在创建对象时由系统自动调用,所定义的对象名后要提供构造函数所要实现的实际参数,形式为:对象名(实际参数表),注意,既然在定义对象的同时系统已经完成了对象的初始化工作,就不能子啊程序中写出形如对象名.构造函数名(实际参数表)的调用构造函数语句

  • 构造函数可以创建对象并初始化对象,任何类的对象在创建时必定要自动调用构造函数,如果程序员在类中没有定义构造函数,C++系统会自动生成一个默认的构造函数,该构造函数无形式参数,也无任何语句,其功能仅用于创建对象,为对象分配空间但不对其中的数据成员进行初始化,系统默认的构造函数的格式如下:类名::类名(){}

    扫描二维码关注公众号,回复: 4305750 查看本文章
  • 说明:如果类定义中已经为类提供了一个构造函数,编译器就不会再提供默认的无参构造函数,每次定义类对象时,编译器会自动查找最适合的构造函数去调用。例如,如果定义对象时没有提供实际参数,编译器会自动查找无参构造函数,如果类定义中已定义了其他有参构造函数而没有定义无参构造函数,C++会给出一个错误提示,可以通过函数重载来实现

  • 注意:一个类可以拥有多个构造函数,对构造函数可以进行重载,重载的多个构造函数必须在形式参数的类型、个数、顺序这三个方面的至少一个方面体现出区别,符合重载函数的条件。形式参数表可以为空

  • 重点:在定义对象的同时程序自动调用构造函数

拷贝构造函数

  • 拷贝构造函数也是类的一个重载版本的构造函数,它能够用一个已知的对象初始化另一个新创建的同类新对象,C++为每一个类定义了一个默认的拷贝构造函数,拷贝构造函数的定义格式如下:class 类名{public:类名(const 类名&对象名)};类名::类名(const 类名&对象名){}

  • 拷贝构造函数在以下3种情况下系统自动调用

    1. 明确表示一个对象初始化另一个对象

    2. 当对象作为函数的实际参数传递给函数的值形式参数,注意,如果形式参数是引用参数或指针参数,都不会调用拷贝构造函数,因为不会产生新对象

    3. 当对象作为函数返回值

析构函数

  • 析构函数的申明和定义与构造函数的形式仅多了一个~

  • 说明:

    1. 析构函数也是类的特殊成员函数

    2. 析构函数没有返回值,必须定义为public属性

    3. 析构函数没有形式参数,此时析构函数不能写成)(void)的形式,由于没有形式参数,因此析构函数不能被重载,每个类只能拥有一个析构函数

    4. 析构函数的调用也是自动执行的,在两种情况下自动调用析构函数:第一种是在对象生存周期结束时系统会自动调用析构函数;第二种是对用new运算符动态创建的对象,在用delete运算符释放时也自动调用析构函数

    5. 和构造函数一样,系统会提供一个默认的析构函数:~类名(){}

  • 一般情况下使用系统默认的析构函数即可,但是,如果一个类中有指针类型的数据成员,并且在构造函数中该指针申请了动态内存空间,此时一定要定义析构函数来释放通过指针所申请的动态空间,保证对象生存周期结束时释放所有的内存空间

  • 注意:构造函数的调用顺序与主函数的调用顺序相同,但析构函数的调用顺序与构造函数正好相反

友元函数

  • 判断两个赋值的对象是否相等,调用Equal函数,原型:bool Equal(类名 &类名A,类名 &类名B);调用函数Equal(对象,对象),如果这两个赋值对象相等,则返回true,否则返回false

  • 普通函数无法访问类的私有数据成员,但如果将函数定义为类的友元函数,则可以直接访问类的私有成员

  • 友元函数的申明为:friend 函数返回类型 函数名(形式参数表);

  • 注意:

    1. 通常友元函数是在类的定义中给出原型说明,申明的位置任意,不受访问属性的限制,申明后的友元函数在类外面给出完整定义,此时前面不能加关键词friend

    2. 友元函数可以直接在类的内部给出定义,定义的首部相当于原型说明

    3. 友元函数的定义方式和调用方式和普通函数一样

    4. 友元函数提供了不同类成员函数之间、类的成员函数与普通函数之间进行数据共享的机制,尤其是一个函数需要访问多个类时,友元函数非常有用

    5. 友元毕竟打破了封装和信息隐藏机制,因此在安全性和效率之间需做折中考虑

    6. 一个类的成员函数作为另一个类的友元成员时,必须先定义这个类,并且在声明友元成员时,要加上成员函数所在类的类名

    7. 对于先使用后定义的标识符都应当给出当前引用声明

静态数据成员

  • 静态数据成员是解决同一个类的不同对象之间数据共享问题

  • 静态数据成员的申明形式为:static 类型名 静态数据成员名;

  • 静态数据成员是在编译时创建并初始化的

  • 公有的静态数据成员可以在对象定义之前被访问,形式:类名::公有静态成员变量名

  • 公有的静态数据成员在对象定义之后还可以通过对象进行访问,形式如下:对象名.公有静态成员变量名

  • 私有的静态数据成员不能被类的外部函数访问,也不能用对象名直接进行访问,而需要通过对象调用操作该静态数据成员的公有函数进行

  • 静态数据成员的初始化:类型 类名::类名 变量名= 值(int Student::total=0)

函数模板与模板函数

  • 模板的定义形式:template <class 类型形式参数> 函数返回类型 函数名 (形式参数表){}:template是一个声明模板的关键字,class在此并不表示类的意思,只是借用此关键字表示其后是一个类型参数。类型形式参数表中的内容是用来抽象类型的标识,将来可以用任何实际的类型(包括类类型)进行实例化

  • 模板的定义格式中“类型形式参数表”说明在定义模板时,类型参数可以时由多个参数类型组成的,每个类型前面都必须由关键字class引导

猜你喜欢

转载自blog.csdn.net/IT_SoftEngineer/article/details/82941132
今日推荐