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的时候,

有个两个问题:

  1. li4泄露了
  2. 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指针 全局函数和成员函数 友元 操作符重载的更多相关文章

  1. c++-变量,this指针,全局函数,成员函数,自定义数组类

    区分变量属于哪个对象 c++对象管理模型初探 C++类对象中的成员变量和成员函数是分开存储的,C中内存四区仍然有效 C++编译器对普通成员函数的内部处理(隐藏this指针) this指针解决函数形参和 ...

  2. 为什么NULL指针也能访问成员函数?(但不能访问成员变量)

    查看更加详细的解析请参考这篇文章:http://blog.51cto.com/9291927/2148695 看一个静态绑定的例子: 1 #include <iostream> 2 3 u ...

  3. C++虚函数和成员函数内存 this指针问题

    father* p=new son; p->disp(...); 发现有好多人this指针的本质有错误的认识,估计不少人一说起this指针,脑袋立即反应出:那个类里使用的this指针,那么这个指 ...

  4. [转]浅谈C++指针直接调用类成员函数

    找了一番之后发现这篇文章讲的很清楚. 传送门

  5. 成员函数指针与高效C++委托 (delegate)

    下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...

  6. 成员函数指针与高性能C++委托

    1 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值. ...

  7. [转]成员函数指针与高性能的C++委托

    原文(作者:Don Clugston):Member Function Pointers and the Fastest Possible C++ Delegates 译文(作者:周翔): 成员函数指 ...

  8. C++ 指向类成员函数指针的用法(转自维基百科)

    类成员函数指针 类成员函数指针(member function pointer),是C++语言的一类指针数据类型,用于存储一个指定类具有给定的形参列表与返回值类型的成员函数的访问信息. 目录 1 语法 ...

  9. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

随机推荐

  1. Spring MVC-表单(Form)标签-复选框(Checkbox)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_checkbox.htm 说明:示例基于Spring MVC 4.1.6. 以下示 ...

  2. linux中O(1)调度算法与全然公平(CFS)调度算法

    一.O(1)调度算法 1.1:优先级数组 O(1)算法的:一个核心数据结构即为prio_array结构体. 该结构体中有一个用来表示进程动态优先级的数组queue,它包括了每一种优先级进程所形成的链表 ...

  3. 问题1-The type java.lang.String cannot be resolved. It is indirectly referenced from required .class files

    问题一:The type java.lang.String cannot be resolved. It is indirectly referenced from required .class f ...

  4. Java基础:异常捕获顺序

    转载请注明出处:jiq•钦's technical Blog public voidtestException(){ int a[] = {1,2,3};int q = 0; try{ for(int ...

  5. Linux命令(八)——vi编辑器的使用

    vi编辑器是linux系统下的标准正文编辑器,有三种基本模式:命令行模式.插入模式和底行命令模式. 1.命令行模式:控制屏幕光标的移动,字符.字或行的删除,移动复制某区段及进入插入模式或底行命令模式下 ...

  6. 数据结构(三)——栈Stack

    栈是一种特殊的线性表,插入和删除操作均在栈顶进行,插入操作称为入栈,删除操作称为出栈. 一.顺序栈 利用顺序存储方式实现的栈称为顺序栈,下面是它的一些基本操作实现算法,需要理解和记忆. 1.顺序栈的类 ...

  7. Makefile中用宏定义进行条件编译(gcc -D)/在Makefile中进行宏定义-D【转】

    本文转载自:http://blog.csdn.net/maopig/article/details/7230311 在源代码里面如果这样是定义的:#ifdef   MACRONAME//可选代码#en ...

  8. JDK8新特性:函数式接口

    一,定义 函数式接口,英文为Functional Interface.首先它是一个接口,那么它与其它接口有什么不同呢?不同点就是在这个接口中只允许有一个抽象方法. 这里的只允许一个抽象方法不包括以下几 ...

  9. ZOJ-3988 2017CCPC-秦皇岛 Prime Set 二分图最大匹配 匈牙利

    题面 题意:给你n个数,你可以选择2个和为质数的数为一对,每个数可以重复选择,你最多选k对,问你最多能选多少个不同数出来 题解:首先思考怎么样的数和为质数,2个偶数相加不行,除了1+1以外2个奇数相加 ...

  10. centos6.5 + Nat网络模式 +SecureCRT 的相关设置

    步骤1:先去查看子网掩码和子网ip 提示:打开后先不要关闭,后边还会使用 步骤2:查看本机名 输入: hostname 步骤3:修改本机名 vi /etc/sysconfig/network 在”Ho ...