C++基础 (4) 第四天 this指针 全局函数和成员函数 友元 操作符重载
1static强化练习-仓库进货和出货

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Goods
{
public:
// 无参数的构造函数
Goods()
{
next = NULL;
weight = 0;
cout << "创建了一个货物重量是" << 0 << "的物品" << endl;
}
// 有参数的构造函数
Goods(int w)
{
weight = w;
next = NULL;
// 每创建一个货物 总重量应该加
cout << "创建了一个货物重量是" << w << "的物品" << endl;
taotal_weight += w;
}
// 提供一个静态的成员函数来访问静态成员
static int getTotal()
{
return taotal_weight;
}
~Goods()
{
cout << "删除了一箱重量是" << weight << "货物" << endl;
taotal_weight -= weight;
}
// 给货物类变成一个链表的节点
Goods * next;
private:
int weight; // 货物的重量
static int taotal_weight; // 所有货物的总重量
};
// 一开始所有货物总重量是0
int Goods::taotal_weight = 0;
// 进货的方法
void buy(Goods* &head,int w)
{
// 创建一个新的货物
Goods *new_goods = new Goods(w); // 通过new在堆上开辟空间,调用了Goods类的有参构造函数
if (head == NULL) {
// 如果head是空
head = new_goods; //无头链表
}
else
{
// 如果head不为空,从head表头添加
new_goods->next = head;
head = new_goods;
}
}
// 出货的方法
void sale(Goods * &head)
{
if (head == NULL) {
cout << "仓库已经没有货物了" << endl;
return;
}
Goods *temp = head;
head = head->next;
delete temp;
cout << "saled " << endl;
}
int main(void)
{
int choice = 0;
Goods *head = NULL; // 所有货物的表头
do {
cout << "1 进货" << endl;
cout << "2 出货" << endl;
cout << "0 退出" << endl;
cin >> choice;
switch (choice)
{
case 1:
// 进货
cout << "请输入要创建的货物的重量" << endl;
int w;
cin >> w;
buy(head, w);
break;
case 2:
// 出货
sale(head);
break;
case 0:
// 退出
return 0;
break;
default:
break;
}
cout << "此时仓库中有" << Goods::getTotal() <<"重量的货物" << endl;
} while (1);
return 0;
}
1 昨日回顾
3 this指针



4全局函数和成员函数
多次调用的实现


5 强化练习2-封装一个自定义的数组类




6 友元函数

7 友元类和友元的规则



友元是单向的。

8中午回顾
9操作符重载的概念




10 操作符重载的规则


.*符号:






↑ 这两个参数都是普通类型 这种运算法则编译器已经写好了(必须有一个自定义类型



11 双目运算符重载

全局函数:

注意:这里最好写引用Complex &,不是直接写Complex
a+=b+=c 这个双目运算符的计算 (a+=(b+=c))
如果之前写法没有引用的话
虽然是正确的
但是返回的是匿名临时对象 然后把匿名临时对象的值给真实的C1
最好是写引用的写法 直接修改C1
成员函数:只能写一个参数

12单目运算符重载前++和- -

全局函数:

成员函数:

13 单目运算符后++
占位操作符
// 亚元
a++ // 单目运算符
全局函数:

成员函数:

14操作符重载输入输出操作符
比如我想把虚数cout出来:
原理:
<< 这个双目运算符传入cout 和 c12


(报错显示:没有找到重载)
展开找一下cout和cin的类型

重写:

加上连等功能:



(普通双目操作符的成员函数操作符重载)
cin操作符重载:

15等号操作符
定义一下深拷贝浅拷贝:
浅拷贝,直接复制一份和原来一样的(结果导致里面可能有相同的引用
深拷贝,按逻辑的复制一份新的


当执行s3=s1的时候,
有个两个问题:
- li4泄露了
- zhangsan重复释放

等号操作符默认也是浅拷贝,但是相比拷贝构造有一个风险,
即:当调用拷贝构造函数的时候,一定是初始化,
但当调用等号操作符的时候,可能里面已经有值了,所以应该判断一下,如果有值就释放掉
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Student
{
public:
Student(int id,const char *name)
{
this->id = id;
int len = strlen(name);
this->name = (char*)malloc(len + 1); // 将name在堆上开辟一个空间
strcpy(this->name, name);
}
// 防止浅拷贝 提供一个显示的拷贝构造函数
Student (const Student & another_s)
{
this->id = another_s.id;
int len = strlen(another_s.name);
this->name = (char *)malloc(len + 1);
strcpy(this->name, another_s.name);
}
// 重写等号操作符
// 返回值用引用来实现连等
Student & operator=(const Student & another_s)
{
if (this->name != NULL)
{
// 原来有数据 需要释放
delete[] this->name;
this->name = NULL;
this->id = 0;
}
// 到这为止,之前的数据释放完毕
this->id = another_s.id;
int len = strlen(another_s.name);
this->name = (char *)malloc(len + 1);
strcpy(this->name, another_s.name);
return *this;
}
~Student()
{
if (this->name != NULL)
{
delete[] this->name;
this->name = NULL;
this->id = 0;
}
}
void printS()
{
cout << "id: " << this->id << ", name = " << this->name << endl;
}
private:
int id;
char *name; // 准备在堆上开辟空间
} ;
int main(void)
{
Student s1(1, "张三");
Student s2(s1); // 当你调用拷贝构造的时候,一定是初始化
Student s3(2, "李四"); // 已经有内存分配了
s3 = s1; // 不是调用拷贝构造 //编译器也给我们提供了一个默认的=操作符
s1.printS();
return 0;
}

C++基础 (4) 第四天 this指针 全局函数和成员函数 友元 操作符重载的更多相关文章
- c++-变量,this指针,全局函数,成员函数,自定义数组类
区分变量属于哪个对象 c++对象管理模型初探 C++类对象中的成员变量和成员函数是分开存储的,C中内存四区仍然有效 C++编译器对普通成员函数的内部处理(隐藏this指针) this指针解决函数形参和 ...
- 为什么NULL指针也能访问成员函数?(但不能访问成员变量)
查看更加详细的解析请参考这篇文章:http://blog.51cto.com/9291927/2148695 看一个静态绑定的例子: 1 #include <iostream> 2 3 u ...
- C++虚函数和成员函数内存 this指针问题
father* p=new son; p->disp(...); 发现有好多人this指针的本质有错误的认识,估计不少人一说起this指针,脑袋立即反应出:那个类里使用的this指针,那么这个指 ...
- [转]浅谈C++指针直接调用类成员函数
找了一番之后发现这篇文章讲的很清楚. 传送门
- 成员函数指针与高效C++委托 (delegate)
下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...
- 成员函数指针与高性能C++委托
1 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值. ...
- [转]成员函数指针与高性能的C++委托
原文(作者:Don Clugston):Member Function Pointers and the Fastest Possible C++ Delegates 译文(作者:周翔): 成员函数指 ...
- C++ 指向类成员函数指针的用法(转自维基百科)
类成员函数指针 类成员函数指针(member function pointer),是C++语言的一类指针数据类型,用于存储一个指定类具有给定的形参列表与返回值类型的成员函数的访问信息. 目录 1 语法 ...
- [Reprint]C++普通函数指针与成员函数指针实例解析
这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下 C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...
随机推荐
- [Linux]Apache配置虚拟主机
Apache 配置虚拟主机的方式很多,种类也很多,主要分为两类: 基于名称的虚拟主机 (每个 IP 多个站点) 基于 IP 的虚拟主机 (每个 IP 一个站点) 基于名称的虚拟主机: www.2 ...
- LeetCode之RemoveElement
题目: Given an array and a value, remove all instances of that value in place and return the new lengt ...
- java5核心基础之泛型(3)-泛型作用于编译阶段-怎样将String对象传入Integer类型的泛型对象中?
泛型作用于编译阶段: 泛型是作用于编译阶段,在编译阶段控制类型,以确保在编写代码的时候仅仅能传入指定类型数据到泛型集合对象中去. 怎样验证呢,贴代码例如以下: package highBasic.ge ...
- eclipse导入myeclipse中的web项目
场景:在myeclipse编写的一个简单的电信计费系统项目,后面公用到eclipse,想把它给导入到eclipse中 操作:eclipse中在packag explorer空白处右键>impor ...
- ubuntu14.04 安装LNMP
新书上市<深入解析Android 5.0系统> 通常我们使用centos来组建LNMP,可是我们开发时多使用ubuntu的桌面版本号来调试,以下将具体介绍怎样在ubuntu上安装一套LNM ...
- luogu2761 软件补丁问题 状态压缩最短路径
关键词:状态压缩 最短路径 想不出快速办法,就先考虑考虑暴力.枚举每一种错误分布的情况,然后通过可用的补丁转化为另多种情况,这些情况又转化为更多种情况……我们可以用图来表示这种关系! 状态压缩:每个错 ...
- 各种编程语言功能综合简要介绍(C,C++,JAVA,PHP,PYTHON,易语言)
各种编程语言功能综合简要介绍(C,C++,JAVA,PHP,PYTHON,易语言) 总结 a.一个语言或者一个东西能火是和这种语言进入某一子行业的契机有关.也就是说这个语言有没有解决社会急需的问题. ...
- Constructing Roads --hdoj
Constructing Roads Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) ...
- 杂项:Kafka
ylbtech-杂项:Kafka Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站 ...
- 2.2.3 修改JSX代码
/** * Sample React Native App * https://github.com/facebook/react-native * @flow */ import React, { ...