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. fzu 2173 floyd+矩阵快速幂

    #include<stdio.h> #define inf 1000000000000000 #define N 100 long long tmp[N][N],ma[N][N]; int ...

  2. 草草搞了个SERVLET的注册登陆功能

    按书来的,学习阶段,一切都好新奇..至少对比于DJANGO,好像复杂点点,但HTTP的东东,是相通的哈. package cc.openhome.controller; import java.io. ...

  3. ASP.NET--MVC--伪静态

    原文地址 以前伪静态很流行主要是为了SEO优化排名,现在搜索引擎对静态网站和动态网站的权重差不多了,就没有必要再伪静态了,个人意见,仅供参考. 有些客户要求设置静态的,为了完成需求,而且更简单的做法就 ...

  4. Ada boost学习

    http://blog.csdn.net/dark_scope/article/details/14103983 据说在Deep Learning出来之前,SVM和Adaboost是效果最好的 两个算 ...

  5. 外网联接内网mssql

    參考地址:http://www.nat123.com/Pages_8_266.jsp 方法例如以下: 1.注冊一个账号,同一时候进入nat123官网加入dns域名解析 点击确认保存,刚刚加入的域名解析 ...

  6. SecureCRT图形界面(通过设置调用Xmanager - Passive程序)

    首先,在server进行设置 假设server是图形化界面启动的,xhost +命令能够不用运行 [root@test ~]# xhost + xhost:  unable to open displ ...

  7. Codeforces Round #198 (Div. 2)E题解

    E. Iahub and Permutations Iahub is so happy about inventing bubble sort graphs that he's staying all ...

  8. (转载)Android常用的Dialog对话框用法

    Android常用的Dialog对话框用法 Android的版本有很多通常开发的时候对话框大多数使用自定义或是 Google提供的V4, V7 兼容包来开发保持各个版本的对话框样式统一,所以这里使用的 ...

  9. hdu1507 最大匹配

    题目大意: 在 n*m在矩阵中,有一些点被标记为黑色,问可以多少对相邻的没有重复的白色块. 思路: 看上去与二分匹配毫无关系.但是没有其他好的解法,转化为二分匹配是正解.二分匹配的条件是{X,Y|E} ...

  10. hdu2883 最大流,判断满流 优化的SAP算法

    这是09年的多校联赛题目,比10年的难度要大.如果没做过hdu3572,建议先去做.有了解题思维再来做这题. 这题与hdu3572类似.但是1 <= si < ei <= 1,000 ...