C++常用函数(一)(析构函数,拷贝函数,友元函数,构造函数,静态函数等)

C++常用函数一 析构函数,拷贝函数,友元函数,构造函数,静态函数等

直接贴代码:

然后逐步分析:

头文件:

//
// Created by szj on 2021/4/23.
//
#ifndef UNTITLED2_T3_H
#define UNTITLED2_T3_H

#include <iostream>
#include <string.h>
//打印引入
using namespace std;

class Pig {
private:
    int age;
    char *name;
public:
    /**
     * static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
     */
    static int id;

    //setter/getter方法
    void setAge(int age);

    void setName(char *name);

    int getAge();

    char *getName();

    //无参数构造
    Pig();

    //有参构造 构造函数不能加名字
    Pig(int);

    //有参构造 构造函数不能加名字
    Pig(int, char *);

    //静态函数
    static void showPig();

    //拷贝函数
    Pig(const Pig &pig);

    //常量函数
    void showPigInfo() const;

    //普通函数
    void showPigInfo2();

    //析构函数
    ~Pig();

    //友元函数
    friend void friendPig(Pig *pig, char *name);
};
#endif //UNTITLED2_T3_H

实现文件:

//
// Created by szj on 2021/4/23.
//

#include "T3.h"

void Pig::setAge(int age) {
    this->age = age;
}

int Pig::getAge() {
    return this->age;
}

void Pig::setName(char *name) {
    this->name = name;
}

char *Pig::getName() {
    return this->name;
}

Pig::Pig() {
    cout << "无参构造器" << endl;
}

Pig::Pig(int age) {
    /**
     * 指针常量:表示地址不可以更改,地址上的值可以修改
     * 常量指针:表示地址可以更改,地址上的值不可以修改
     * 常量指针常量:表示都不可以改
     * 这里的this默认持有隐式的 * const(指针常量:表示地址不可以更改,地址上的值可以修改)
     */
//     this = Pig();
    this->age = age;
    cout << "1个参数参构造器" << endl;
}

Pig::Pig(int age, char *name) {
    this->age = age;
    this->name = name;
    cout << "1个参数参构造器" << endl;
}


Pig::Pig(const Pig &pig) {
    strcpy(this->name, "拷贝函数");
    this->age = pig.age;
    cout << "拷贝函数" << endl;
}

//常量函数特性:不能修改类内任何成员
void Pig::showPigInfo() const {
    cout << "常量函数" << endl;
}

void Pig::showPigInfo2() {
    cout << "普通函数" << endl;
}

//析构函数:程序结束的时候运行,常用来清空初始化内容
Pig::~Pig() {
    cout << "析构函数" << endl;
}

//TODO ----------- 静态函数与友元函数 -----------
//静态函数写法一:
void Pig::showPig() {
    cout << "静态函数" << endl;
}

//友元函数:可以通过相同的参数列表,相同的参数名来获取到类中的私有属性
void friendPig(Pig *pig, char *name) {
    pig->name = name;
    cout << "友元函数" << "\t" << pig->name << endl;
}

// TODO 静态属性
int Pig::id = 2;

main文件:

//
// Created by szj on 2021/4/23.
//

#include "T3.h"

int main() {
    cout << "C++学习,友元函数,常量函数,静态函数等..." << endl;

    /**
     * 本节重点:
     * 指针常量:表示地址不可以更改,地址上的值可以修改
     * 常量指针:表示地址可以更改,地址上的值不可以修改
     * 常量指针常量:表示都不可以改
     */

    //TODO 栈内开辟地址
    Pig pig1;
    pig1.setName("pig1");
    pig1.setAge(12);
    cout << pig1.getName() << " , " << pig1.getAge() << endl;

    //TODO 堆内开辟地址

    //这里会调用无参构造器
    Pig *pig2 = new Pig();

    //普通函数
    pig2->showPigInfo2();

    //常量函数
    pig2->showPigInfo();

    /**
     * 静态函数
     * static函数与普通函数有什么区别:
     *  1。static函数在内存中只有一份
     *  2。存放位置不同,静态函数存放在静态区
     */
    pig2->showPig();

    //静态成员
    cout << pig2->id << endl;
    //将堆内存的引用清空
    delete pig2;
    pig2 = NULL;

    //TODO 友元函数  start ---
    Pig pig3;
    friendPig(&pig3, "友元函数测试成功!");

    //TODO 拷贝函数
    Pig pig4(22, "ohh");
    Pig pig5 = pig4;
    cout << pig5.getName() << "\t" << pig5.getAge() << endl;

    pig1.id = 12;
    pig3.id = 45;
    pig2->id = 99;

    //因为存放在静态区域,只要改变值所有的静态值都会改变!(取最后一个)
    //静态区没有this的概念!静态区都是共享的区域
    // (所以说,静态只能存有一个值,要改变全部都改变)
    cout << pig3.id << "\t" << pig2->id << "\t" << Pig::id << endl;
    return 0;
}

打印结果:
在这里插入图片描述

析构函数

Pig::~Pig() {
    cout << "析构函数" << endl;
}

程序结束的时候运行,常用来销毁初始化内容

友元函数

在这里插入图片描述

可以通过相同的参数列表,相同的参数名来获取到类中的私有属性

常量函数

void Pig::showPigInfo() const {
    cout << "常量函数" << endl;
}

不可以改变类内的所有值,常用来打印值

static函数与普通函数

在这里插入图片描述
红色静态函数,绿色普通函数

  • static函数在内存中只有一份
  • 存放位置不同,静态函数存放在静态区

static函数与普通函数深刻理解地址

拷贝函数

例子:

 //TODO 拷贝函数
    Pig pig4(22, "ohh");
    Pig pig5 = pig4;
    cout << pig5.getName() << "\t" << pig5.getAge() << endl;

拷贝函数:

Pig::Pig(const Pig & pig) {
    strcpy(this->name, "拷贝函数");
    this->age = pig.age;
    cout << "拷贝函数" << endl;
}

结果:

拷贝函数
拷贝函数	22

另一个对象给当前对象赋值时,可以对现在进行操作,得出一个新的值

问:

下列一段代码中:既然this表示的是Pig,那么为什么this = Pig();会报错,而this->age = age;不会报错?

Pig::Pig(int age) {
//  this = Pig();
    this->age = age;
    cout << "1个参数参构造器" << endl;
}

答:
这里的this默认持有隐式的 指针常量(* const)

  • 指针常量:表示地址不可以更改,地址上的值可以修改
  • 常量指针:表示地址可以更改,地址上的值不可以修改
  • 常量指针常量:表示都不可以改

下一章:C++常用函数(二)(纯虚函数,全虚函数,模拟 java 中接口回调等)

原创不易,您的点赞就是对我最大的支持~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s10g

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值