C++——面向对象(一)——默认的构造函数(1)
来源:互联网 发布:mysql错误1054 编辑:程序博客网 时间:2024/05/18 11:27
C++——类和对象
面向过程:C
面向对象:C++
面向对象的设计模式,如图:
在现实世界中,存在很多实体,都有自己的属性和行为,比如猫,狗,人,等等,他们都属于动物,人的属性为姓名,年龄和性别,行为吃,睡,玩,将这些属性和行为抽象出来形成抽象数据类型,那么这个抽象数据类型在计算机的世界中就对应着类,计算机的类有自己的成员变量和成员函数,将这个类实例化为对象,这个对象就对应着现实世界中的实体,一个类可以实例化出多个对象,成员变量是私有的,成员函数是公有的,就像现实世界你的名字,年龄和性别是私有的,但是行为吃,睡,玩,是人类所共有的。
#include <iostream>using namespace std;typedef struct _Stud//学生类型的结构体{char *pname;int age;float score;}Stud;void init(Stud *pstud, char *name, int age, float score)//学生的结构体变量的指针,初始化{pstud ->pname= new char[strlen(name) + 1];//开辟动态内存strcpy(pstud->pname, name);pstud ->age = age;pstud ->score = score;}void show(Stud *pstud)//打印函数{cout<<"name: "<<pstud->pname <<endl;cout<<"age: "<<pstud->age <<endl;cout<<"sccore: "<<pstud->score <<endl;}void release(Stud *pstud)//释放内存{delete []pstud->pname;pstud->pname = NULL;}int main(){Stud stud;init(&stud, "zhang", 20, 78.5);show(&stud);release(&stud);return 0;}
打印结果:
不能让指针指向其他的,也就是不能修改指针,所以给结构体前面加 const , 如图 :
通过函数指针间接调用函数,
面试问题:通过指向这个函数的指针调用函数 和 通过函数名调用函数有什么区别?
函数指针的使用:通过函数指针回掉函数
struct 和 class 区别:
1.struct 默认共有,class 默认私有
2.C++里面可以定义空的结构体,占1个字节,
C里面 不可以定义空的结构体
面向对象思想的三大特征: 封装 ,继承,多态,
封装:
封装与隐藏
访问限定符:
1.public: 共有的, 任意位置都能访问
2.protected:保护的,体现在继承派生,子类可以访问父类的保护成员
3.private: 私有的,,只有类中能够访问,也就是只有在自己才能访问,谁都不能访问
#include <iostream>using namespace std;class CGoods//类名以大写C开头{public://成员方法 _thiscallvoid Register(char *name, int amount, float price);void Show();//自动被编译器处理成Inline函数void SetName(char *name){strcpy(_name,name);}void SetAmount(int amount){_amount = amount;}void SetPrice(float price){_price = price;}void GetName(char *name){strcpy(_name,name);}//char *GetName(){return _name};//error,修改了私有成员变量的值int GetAmount(){return _amount;}float GetPrice(){return _price;}private:char _name[20];int _amount;float _price;};//类外有标准的函数栈帧的开辟void CGoods::Register(char *name, int amount, float price)//必须在函数名之前加上类名{strcpy(_name,name);_amount = amount;_price = price;}void CGoods::Show(){cout<<"name:"<<_name<<endl;cout<<"amount:"<<_amount<<endl;cout<<"price:"<<_price<<endl;}int main(){CGoods good;good.Register("mianbao",20,22.5);good.Show();return 0;}
运行结果:
从这份代码可以看出,用同一个类类型所定义的不同对象,每个人都有一份成员变量,但是它们共享类里面的成员方法
把数据带入栈的方式,Push操作 和 _fastcall,快速调用约定,省略了压栈的过程,直接通过寄存器带进去的,
move移值,lea移地址,
从反汇编可以看出,good1.Register("shangpin1", 200, 8.5) 其实底层是传了4个值,good1.Show() 传了一个值,通过寄存器带入的,比传统压栈速度快,在汇编上实际上是 CGoods::good1.Register(&good1, "shangpin1", 200, 8.5),也就是说除了表面上的三个参数,还要把被调用对象的地址传进去,再汇编上和 C 一样,
调用的时候加了实参,那么形参也得有,形参里面都多了 CGoods *this ,为了防止指针指向另外的对象,指针前面要加const,即CGoods const *this,
我们把接收对象地址的指针叫做 this 指针,this 指针指向调用该成员方法的对象,关键字不能定义变量名,this 指针在编译的时候会自动添加,
CGoods
2.调用对象的构造函数
2.调用对象的构造函数
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>using namespace std;#pragma warning(disable:4996)class CStack{public:CStack(){mtop = 0;}~CStack(){}CStack(const CStack& rhs){for (int i = 0; i < rhs.mtop; ++i){mval[i] = rhs.mval[i];}mtop = rhs.mtop;}void operator=(const CStack& rhs){if (this == &rhs){return;}for (int i = 0; i < rhs.mtop; ++i){mval[i] = rhs.mval[i];}mtop = rhs.mtop;}void Push(int data){if (mtop < MAXSIZE){mval[mtop++] = data;}}int Pop(){if (mtop == 0)throw("Stack Empty!");return mval[--mtop];}int Top(){if (mtop == 0)throw("Stack Empty!");return mval[mtop-1];}void Show(){for (int i = 0; i < mtop; ++i){cout << mval[i] << " ";}cout << endl;}private:enum{ MAXSIZE = 20 };int mval[MAXSIZE];int mtop;};int main(){CStack st;for (int i = 0; i < 10; ++i){st.Push(i+1);}st.Show();int a = st.Pop();st.Show();cout << a << endl;return 0;}
运行结果:
- C++——面向对象(一)——默认的构造函数(1)
- C++——面向对象(二)——默认的构造函数(2)
- Java基础(面向对象一——理解、匿名函数、封装、构造函数和this关键字的使用)
- 面向对象的编程——构造函数和析构函数(1)
- C#——面向对象 (一)
- 面向对象的编程——拷贝构造函数(1)
- JavaScript面向对象(2)——创建对象的工厂模式与构造函数模式
- 面向对象的编程——构造函数和析构函数(2)
- 第四周项目1—三角形类的构造函数(2)设计默认构造函数
- javascript面向对象编程——构造函数的封装
- javascript面向对象编程——构造函数的继承
- 面向对象的编程——拷贝构造函数(2)
- JAVA面向对象知识点总结(2)—封装、构造函数、构造代码块、this关键字
- Javascript 面向对象编程(一):封装/构造函数的继承/非构造函数的继承
- 第四周 项目一 三角形的构造函数—使用有默认参数的构造函数
- 第四周项目一——三角形类的构造函数——默认构造函数
- 第四周 项目一 三角形类的构造函数—设计默认构造函数
- 【java基础】——java面向对象(上)—面向对象、类与对象、封装、构造函数等
- 蓝桥杯 算法训练 区间k大数查询
- (C++)二叉树的线索化 / 线索二叉树
- 初学mysql sever 笔记|主机与虚拟机在同一网段
- 【LintCode】3.统计数字(Medium)解题报告
- codeforces 151A【python】
- C++——面向对象(一)——默认的构造函数(1)
- 可行性背包
- C++ 类的初始化列表
- cmd页面的大小
- 关于bits
- HTML测试(w3school)
- Python基础检测:20171105
- codeforces 560A【python】
- openwrt增加密码及ssh的方法