博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++语言-02-函数
阅读量:5110 次
发布时间:2019-06-13

本文共 2789 字,大约阅读时间需要 9 分钟。

普通函数

C++是在C语言的基础上增加了面向对象特性的语言,是C语言的超集
  • C++中的普通函数与C语言中的普通函数具有类似的性质。请参照以下博客:

与类相关的函数

C是一种OOP语言,类是OOP语言的核心,C++中的一部分函数与类相关。
  • 构造函数与拷贝构造函数
    • 构造函数
      • 是一种特殊的成员函数,在使用类创建对象时被执行,通常用于在创建对象时为某些成员变量设置初始值。
      • 构造函数的定义规范
        • 函数名与类名相同
        • 不返回任何值
      • 构造函数的种类
        • 无参的构造函数
        • 有参的构造函数
          • 可以使用初始化列表来初始化字段
      • 定义方式

        // 无参的构造函数ClassName() {    // body of the function}// 有参的构造函数,使用初始化列表ClassName(MemberVariableType memberVariable) : variable(memberVariable) {    // body of the function}
    • 拷贝构造函数
      • 是一种特殊的构造函数,在创建对象,使用同一类中之前创建过的对象来初始化新创建的对象
      • 拷贝构造函数被调用的场景
        • 使用另一个同类型的对象来初始化新创建的对象
        • 赋值对象把它作为参数传递给函数
        • 赋值对象,并从函数返回这个对象
      • 注意
        • 若没有定义拷贝构造函数,编译器会自动定义一个。但是在一下情形下,必须定义一个拷贝构造函数
          • 类中有指针类型的成员变量,并且有动态内存分配
      • 定义方式

        ClassName(const ClassName &classInstance) {    variable = classInstance.variable}
  • 析构函数
    • 是一种特殊的成员函数,在类的象被销毁时被执行,通常用于在跳出程序前释放资源
    • 析构函数的定义规范
      • 函数名与类名相同,需要在函数名前加上波浪号(~)作为前缀
      • 不返回任何值,不带有任何参数
    • 定义方式

      ```  ~ClassName() {      // Release the resource of the classInstance  }  ```
  • 友元函数
    • 一种定义在类的外部,有权访问类的私有成员和保护成员的函数
    • 定义方式

      // 在类内部定义友元函数原型friend returnType functionName();// 在类外部定义友元函数的实现,不需要范围解析运算符 ::returnType functionName() {    body of the function;}
    • 注意
      • 友元函数不是成员函数,不能使用this指针
  • 内联函数
    • 在编译阶段,编译器会将内联函数的代码副本复制到每一个调用该该内联函数的地方,使用inline关键字定义,如下

      inline returnType functionName() {    // body of the function}
    • 内联函数的注意事项
      • 类定义中定义的函数,默认都是内俩函数,即使没有使用inline关键字
      • 每次修改内联函数,都必须重新编译该函数的所有调用代码(替换函数调用处旧的内联函数副本)
  • 示例

    • 定义Animal类

      class Animal {private:    string name; // 名字    int *age; // 年龄public:    // set方法    inline void setName(string animalName) {        name = animalName;    }    void setAge(int animalAge) {        *age = animalAge;    }    // 无参的构造函数    Animal() {        cout << "Normal constructor" << endl;        // 为指针分配内存地址        age = new int;    }    // 有参的构造函数    Animal(string animalName, int animalAge) {        cout << "Normal constructor with parameter" << endl;        name = animalName;        // 为指针分配内存地址        age = new int;        *age = animalAge;    }    // 拷贝构造函数    Animal(const Animal &animal) {        cout << "Copy constructor" << endl;        name = animal.name;        // 为指针分配内存地址        age = new int;        *age = *animal.age;    }    // 友元函数    friend void printAnimal(const Animal animal);    // 析构函数    ~Animal() {        cout << "Release the resource of the classInstance" << endl;        delete age;    }};
    • 定义Animal类的友元函数

      // 友元函数的定义void printAnimal(const Animal animal) {   cout << "狗的名字:" << animal.name << " 年龄:" << *animal.age << endl;}
    • main()函数

      int main(int argc, const char * argv[]) {    // 使用有参的构造函数创建Animal对象    Animal dog1;    dog1.setName("TOBY");    dog1.setAge(5);    // 使用友元函数打印dog1    printAnimal(dog1);    // 使用无参的构造函数创建Animal对象    Animal dog2("MAX", 4);    // 使用友元函数打印dog2    printAnimal(dog2);    // 使用拷贝构造函数创建Animal对象    Animal dog3 = dog2;    printAnimal(dog3);    return 0;}

转载于:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/5211996.html

你可能感兴趣的文章
洛谷 P2234 [HNOI2002]营业额统计
查看>>
SetTimeOut 与 SetInterval 区别
查看>>
VC++编程 两类典型的 LNK2001错误分析及解决方法
查看>>
对于redis框架的理解(三)
查看>>
C语言模块化编译介绍
查看>>
file控件,以及fileList对象。
查看>>
关于多线程(GCD介绍)
查看>>
设计模式之观察者模式
查看>>
T-SQL基础(五)之增删改
查看>>
Jzoj4786 小a的强迫症
查看>>
redis配置密码
查看>>
bootstrap之辅助类
查看>>
子元素定位,父元素高度自适应
查看>>
js获取json属性值的两种方法
查看>>
[Algorithms] Queue & Priority Queue
查看>>
[React + Functional Programming ADT] Connect State ADT Based Redux Actions to a React Application
查看>>
[RxJS] Getting Input Text with Map
查看>>
[Node.js]27. Level 5: URL Building & Doing the Request
查看>>
G Data为用户提供微软安全漏洞解决方案
查看>>
java中多线程的实例代码
查看>>