// C++ 第四章:类的高级部分
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
#pragma warning(disable:4996)
// 1.静态成员
// 2.友元函数
// 可以访问类的私有成员
// 含有参数:一是你要访问的朋友,二是正常参数
// 3.拷贝构造函数:初始化中为了避免按位拷贝导致的指针悬空
// 利用对象初始化对象
// 调用场合:
// b.函数的形参为对象
// a.函数内部对象初始化对象
// c.函数的返回值为对象
// 4.运算符重载:解决赋值中按位拷贝导致的指针悬空问题
// 用对象给对象赋值
class StaticDemo
{
private:
int y;
char *name;
public:
static int x; // 静态数据成员,类内声明,就没有必要设置成私有成员
StaticDemo()
{
y=0;
}
StaticDemo(int y1, char *name1)
{
y=y1;
// 需要为指针分配空间
name=new char[strlen(name1)+1];
strcpy(name,name1);
}
// 拷贝构造函数
StaticDemo(const StaticDemo &demo)
{
y=demo.y;
// 需要为指针分配空间
name=new char[strlen(demo.name)+1];
strcpy(name,demo.name);
}
int gety(){return y;}
char *getname(){return name;}
static void addx(int n); // 静态函数成员,专为静态数据成员设计
friend void sety(int n,StaticDemo &demo); // 友元函数
StaticDemo operator=(const StaticDemo &demo); // 重载=
StaticDemo operator+(const StaticDemo &demo) // 重载+
{
y+=demo.y;
return *this;
}
StaticDemo operator++() // 前置++
{
y++;
return *this;
}
StaticDemo operator++(int) // 后置++
{
// 利用拷贝构造函数创建临时对象
StaticDemo temp=*this;
y++;
return temp;
}
// 析构函数
~StaticDemo()
{
delete []name;
}
};
int StaticDemo::x=0; // 静态数据成员类外初始化
void StaticDemo::addx(int n) // 静态函数成员
{
x+=n;
}
void sety(int n, StaticDemo &demo) // 友元函数
{
demo.y=n;
}
StaticDemo StaticDemo::operator=(const StaticDemo &demo) // 重载=
{
delete []name;
name=new char[strlen(demo.name)+1];
strcpy(name,demo.name);
y=demo.y;
return *this;
}
int main(void)
{
// 静态成员
char str[]="zcy";
StaticDemo app(5,str);
StaticDemo::addx(2);
cout<<app.x<<endl;
app.addx(3);
cout<<StaticDemo::x<<endl;
// 友元函数
sety(7,app);
cout<<app.gety()<<endl;
// 拷贝构造函数
StaticDemo app1=app;
cout<<"1:\n";
cout<<app1.gety()<<endl;
cout<<app1.getname()<<endl;
// 重载=
StaticDemo app2;
app2=app;
cout<<"重载=,2:\n";
cout<<app2.gety()<<endl;
cout<<app2.getname()<<endl;
// 重载+
StaticDemo app3;
app3=app1+app2;
cout<<"重载+,1+2=3:\n";
cout<<app3.gety()<<endl;
cout<<app3.getname()<<endl;
// 重载前置++
++app3;
cout<<"重载前置++,++3:\n";
cout<<app3.gety()<<endl;
cout<<app3.getname()<<endl;
// 重载后置++
cout<<"重载后置++,4=3++:\n";
StaticDemo app4;
app4=app3++;
cout<<app4.gety()<<endl;
cout<<app4.getname()<<endl;
cout<<app3.gety()<<endl;
cout<<app3.getname()<<endl;
return 0;
}
C++ 第四章:类的高级部分
最新推荐文章于 2022-08-20 19:58:54 发布
