C++ 面向对象

c++创建对象的时候如果使用new运算符,将会返回返回一个指针,指向堆中的内存地址

类,对象

类定义

定义一个类,用来描述一个盒子

#include <iostream>using namespace std;class Box {public: double length;   // 定义长度double breadth;  // 定义宽度double height;   // 定义高度
};int main(){return 0;
}

public 表明这是一个公共的成员。class定义一个类

定义对象

#include <iostream>using namespace std;class Box {public: double length;   // 定义长度double breadth;  // 定义宽度double height;   // 定义高度
};int main(){Box box1;  // 声明一个对象Box box2; // 声明一个对象return 0;
}
#include <iostream>using namespace std;class Box {public: double length;   // 定义长度double breadth;  // 定义宽度double height;   // 定义高度
};int main(){Box box1;  // 声明一个对象Box box2; // 声明一个对象double volume = 0.0;    // 定义一个储存体积的// 第一个盒子box1.length = 5.0;box1.breadth = 7.0; box1.height = 5.0;// 第二个盒子box2.length = 10.0;box2.breadth = 10.0;box2.height = 10.0;// 第一个盒子的体积volume = box1.length * box1.breadth * box1.height;cout << "第一个盒子的体积" << volume << endl;// 第二个盒子的体积volume = box2.length * box2.breadth * box2.height;cout << "第二个盒子的体积" << volume << endl;return 0;
}

类和函数成员

类可以为函数成员。

#include <iostream>using namespace std;int getVolume(void){return 3;
}class Box {public: double length;  // 定义长度double breadth;  // 定义宽度double height;   // 定义高度double getVolume(void);  // 调用函数,将会返回体积。
};int main(){return 0;
}
#include <iostream>using namespace std;class Box {public: double length;   // 定义长度double breadth;  // 定义宽度double height;   // 定义高度double getVolume(void){return length * breadth * height;}
};int main(){return 0;
}

范围解析运算符

访问解析运算符为:: 说明函数属于哪个类
范围解析运算符指明函数属于哪个类,标明作用域。

#include <iostream>using namespace std;int year;   // 定义一个全局变量class Box {public: double length;    // 定义长度double breadth;  // 定义宽度double height;   // 定义高度double getVolume(void){return length * breadth * height;}
};void setYear(int year){::year = year;    // 指向全局变量
}int main(){return 0;
}

在类的外部标明类的成员

#include <iostream>using namespace std;int year;   // 定义一个全局变量class Box {public: double length;    // 定义长度double breadth;  // 定义宽度double height;   // 定义高度double getVolume(void){return length * breadth * height;}
};void setYear(int year){::year = year;    // 指向全局变量
}double Box::getLength(void){return length; // 此处返回的是Box类下的getLength变量
}int main(){return 0;
}

关于inline

解决小函数频繁入栈,出栈的问题,引入inline关键字。
即,内联函数。
使用内联函数的时候,编译器会进行自动替换,即类似于C语言中的宏。以减少入栈和出栈的操作。

这是建议,是否取决于编译器

使用inline的时候,建议在h文件中,需要的时候写inline
https://openhome.cc/Gossip/CppGossip/inlineFunction.html

关于虚函数

虚函数,用来实现多重继承和多态。
这个后期在说

类访问修饰符

数据的封装为面向对象的特点。
防止函数直接访问类的内部成员。
作用域为一个大花括号

public成员

public在外部可以访问

#include <iostream>using namespace std;class Line{
public:double length;void setLength(double len);    // 设置lengthdouble getLength(void);  // 获取length
}// 对成员函数进行定义
double Line::getLength(void){return length;
}void Line::setLength(double len){length = len;
}// 主函数
int main(){Line line;// 设置长度line.setLength(6.0);cout << line.getLength() << endl;// 设置长度line.length = 10.0;cout << line.length << endl;return 0;
}

private 成员

即私有成员,在外部无法访问

缺省值为private 私有的

protected 保护成员

和私有成员类似,最大的不同在于在子类中仍然可以访问。

构造函数 析构函数

构造函数

创建对象的时候会执行构造函数

#include <iostream>using namespace std;class Line{
public:void setLength(double len);double getLength(void);Line();    // 构造函数private: // 私有double length;
};// 成员函数定义
Line::Line(void)
{cout << "Object is being created" << endl;
}void Line::setLength(double len){length = len;
}double Line::getLength(void){return length;
}// 程序主函数
int main(){Line line;// 设置长度line.setLength(6.0);cout << line.getLength() << endl;return 0;
}

析构函数

类的特殊成员函数,每次删除创建的对象将会执行析构函数

java中是直接将指向设置为null,即可自动进行清除

#include <iostream>using namespace std;class Line{
public:void setLength(double len);double getLength(void);Line();    // 构造函数~Line(); // 析构函数private: // 私有double length;
};// 成员函数定义
Line::Line(void)
{cout << "Object is being created" << endl;
}Line::~Line(){cout << "Object is being deleted" << endl;
}void Line::setLength(double len){length = len;
}double Line::getLength(void){return length;
}// 程序主函数
int main(){Line* line = new Line();// 设置长度line->setLength(6.0);cout << line->getLength() << endl;delete line;return 0;
}

构造函数初始化列表

#include <iostream>using namespace std;class Line{
public:void setLength(double len);double getLength(void);Line();    // 构造函数~Line(); // 析构函数private: // 私有double length;
};// 成员函数定义
Line::Line(void):length(3)  // 等价于内部定义 length = 3
{cout << "Object is being created" << endl;
}Line::~Line(){cout << "Object is being deleted" << endl;
}void Line::setLength(double len){length = len;
}double Line::getLength(void){return length;
}// 程序主函数
int main(){Line* line = new Line();// 设置长度line->setLength(6.0);cout << line->getLength() << endl;delete line;return 0;
}

需要注意的是,声明的时候是按照声明的顺序进行初始化的,而不是根据初始化列表进行初始化的

拷贝构造函数

一种特殊的构造函数。

这里会涉及到深拷贝和浅拷贝的问题,深拷贝开辟空间,浅拷贝进行引用

使用的场景
把对象传入函数
将对象返回函数
深拷贝,浅拷贝,即使用同类型的对象初始化一个新的对象

类中有指针变量,动态内存分配的时候,必须设置一个拷贝构造函数,如果没有编译器会自动生成拷贝构造函数

#include <iostream>using namespace std;class Line{
public:int getLength(void);void setLength(int length);Line(int len);Line(const Line &obj);  // 拷贝构造函数 传入的是地址~Line();private:int* ptr;   // 定义一个空指针
};// 设置成员函数,以及构造函数
Line::Line(int len){cout << "调用构造函数" << endl;// 进行内存分配ptr = new int; // 在堆中创建内存空间,完成指向*ptr = len;    // 将传入的内容进行复制到新开辟在堆中的内存空间
}Line::Line(const Line &obj){cout << "调用拷贝构造函数并为指针ptr分配内存,即完成深拷贝" << endl;ptr = new int;  // 重新开辟出一块新的内存空间,完成深拷贝*ptr = *obj.ptr;  // 将待拷贝的,进行内容的赋值
}Line::~Line(void){ // 析构函数cout << "释放内存" << endl;delete ptr; // 将指针删除,此时在堆中的一并删除
}
int Line::getLength(void){return *ptr;  // 返回指向堆中int的内容
}
void Line::setLength(int length){*ptr = length;
}void display(Line obj){    // 传入一个对象   创建了一个副本,此时有两份内存。同时储存着objcout << "line 大小:" << obj.getLength() << endl;// 进行赋值obj.setLength(3);cout << "line 大小:" << obj.getLength() << endl;
}
// 主函数
int main(){// 进行拷贝初始化Line line1(10);//Line line3 = line1;Line line2 = line1;  // 调用拷贝构造函数,创建了一块新的空间display(line1);display(line2);cout << line1.getLength() << endl;line1.setLength(4);cout << line1.getLength() << endl;return 0;
}

友元函数

友元函数定义在外部,但是有权访问内部成员。
需要在原型中使用friend关键字

#include <iostream>using namespace std;class Box{double width; // 缺省值为私有的
public:friend void printWidth(Box box); // 定义友元函数,友元函数没有this指针void setWidth(double wid);
};// 成员函数定义
void Box::setWidth(double wid){width = wid;
}// 友元函数不是任何类的成员函数
void printWidth(Box box){// 友元函数可以访问类中的任何成员cout << "width of box" << box.width << endl;
}int main(){Box* box = new Box();// 使用成员函数设置宽度box -> setWidth(10.0);// 使用友元函数输出宽度printWidth(*box);return 0;
}

this指针

每一个对象可以通过this指针访问自己的地址。

#include <iostream>using namespace std;class Box{
public:// 构造函数定义Box(double l = 2.0, double b = 2.0, double h = 2.0){cout << "开始输出值" << endl;length = 1;breadth = b;height = h;}double Volume(){return length * breadth * height;}int compare(Box box){return this -> Volume() > box.Volume(); // this指向调用的对象,返回一个布尔值}
private:double length;double breadth;double height;
};int main(void){Box Box1(3.3, 1.2, 1.5);Box Box2(8.5, 6.0, 2.0);cout << Box1.compare(Box2) << endl;return 0;
}

类的静态成员

使用static关键字
常用于定义工具函数
静态成员函数,没有this指针,只能访问静态成员。
普通成员有this指针,可以访问类中的任意成员,静态成员函数没有this指针。
初始化使用


int Box::objectCount = 0;

至于为什么要在外面定义,因为要进行分配内存空间。
而类仅仅是定义。

C++ 面向对象 一相关推荐

  1. 【AJAX】JavaScript的面向对象

    Ajax中后端数据返回后需要前端通过JavaScript来实现动态数据更新的问题.所以,在Ajax中加深了一遍JavaScript面向对象的印象. 基础部分: JavaScript中创建对象并简单对象 ...

  2. 面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?

    AutoSAR入门到精通系列讲解 将从2019年开始更新关于AutoSAR的知识,从入门到精通,博主xyfx和大家一起进步 雪云飞星 ¥29.90 去订阅 简单地说结构化分析方法主要用来分析系统的功能 ...

  3. 2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类

    目录 scala面向对象 MAVEN依赖 类 - 掌握 创建类和对象 - 掌握 getter/setter - 了解 类的构造器 - 掌握 scala面向对象 MAVEN依赖 <?xml ver ...

  4. php面向对象程序设计,PHP面向对象程序设计类的定义与用法简单示例

    本文实例讲述了PHP面向对象程序设计类的定义与用法.分享给大家供大家参考,具体如下: class Person { private $name; private $sex; private $age; ...

  5. java面向过程和面向对象

    面向过程(Procedure Oriented):说的是功能的行为 面向对象(Object Oriented,简称OO):说的是功能的对象 面向过程理解: 当学习java的时候先了解java语言优良的 ...

  6. day22_面向对象

    面向过程: 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 面向对象: 优点是:解决了程序的扩展性.对 ...

  7. java面向对象-------静态初始化块

    1.构造方法用于对象的初始化!静态初始化块,用于类的初始化操作,在静态初始化块中不能直接访问非static成员. package java面向对象; /** * 测试静态初始化块 */public c ...

  8. 7.12 其他面向对象设计原则3: 依赖倒置原则DIP

    其他面向对象设计原则3: 依赖倒置原则DIP  The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...

  9. Day-16 面向对象03 类与类之间的关系

    一.类与类之间的依赖关系 我用着你,但是你不属于我,这种关系是最弱的,比如,公司和雇员之间,对于正式员工,肯定要签订劳动合同,还得小心伺候着,但是如果是兼职,那无所谓,需要了你就来,不需要你就可以拜拜 ...

  10. 09_Java面向对象_第9天(类、封装)_讲义

    今日内容介绍 1.面向对象思想 2.类与对象的关系 3.局部变量和成员变量的关系 4.封装思想 5.private,this关键字 6.随机点名器 01面向对象和面向过程的思想 A: 面向过程与面向对 ...

最新文章

  1. web-view 跳转小程序页面 网页跳转小程序
  2. Java 程序代码优化方法
  3. leetcode C++ 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,
  4. VTK修炼之道49:图形基本操作进阶_网格平滑(点云的曲面重建技术)
  5. 模板代码复用的三种方式: 宏, 继承, 包含
  6. (DBA之路【十一】)master-slave 机制原理
  7. Java面试题及答案,mysql类型
  8. Swiper学习之二---swiper的配置选项 ①
  9. 简述linux开机启动进程,Linux系统启动流程简述
  10. Ext JS 4倒计时:开发者预览版
  11. html日期选择器小日历样式,9 款样式华丽的 jQuery 日期选择和日历控件
  12. html旋转360度特效,CSS3图片旋转特效(360/60/-360度)?
  13. Cocos Creator 入门笔记
  14. 怎么保存python文件_pycharm怎么保存py文件
  15. 某阿里大神想和java程序员说的话
  16. C++ STL set容器
  17. mac php开发套件_Mac 下搭建 PHP 开发环境的步骤
  18. @keyup.enter.native不生效?看看@keyup.enter.native和@keyup.enter的区别和使用
  19. fixed:Not enough physical memory is available to power on this virtual machine with its configured
  20. 从0到1,为自己创造机遇

热门文章

  1. 常用的JavaScript工具类库收藏
  2. 数据驱动创新 融合引领变革 2017中国工业大数据大会·钱塘峰会今日在杭州国际博览中心顺利举行...
  3. 2016-6-16 拓展练习
  4. 网络通信中关于请求数据、断点续传和写入本地文件
  5. .NET Micro Framework 用户程序升级说明
  6. JDK源码(20)-Thread
  7. 宝藏世界显示连接不到服务器,宝藏世界新手常见问题解答 新手攻略
  8. ubuntu15.04 php版本,在ubuntu下安装php版本问题
  9. 海致星图2022校招算法笔试题
  10. mamp 配置php,Mac OSX下使用MAMP安装配置PHP开发环境