直接贴代码:
然后逐步分析:
头文件:
//
// 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函数在内存中只有一份
- 存放位置不同,静态函数存放在静态区
拷贝函数
例子:
//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 中接口回调等)
原创不易,您的点赞就是对我最大的支持~