类的成员函数

C++系列:对象和类(一)

岁酱吖の 提交于 2020-02-02 00:43:20
背景 面向对象编程 首先, 面向对象编程(Object-Oriented Programming, OOP) 是一种 编程风格/程序设计思想/编程范式 。它 强调以对象(数据+方法)为中心 ,而不是以过程为中心(即面向过程编程)。 由此可见,从某种意义上讲,编程语言可以在不同程度上支持这种风格。即使 C 语言也可以实现这种风格,只不过实现起来难度更大、更为曲折。 C++ 就是对 OOP 特性支持的比较好的编程语言。 抽象 抽象(abstraction) 是一种 OOP 特性。处理复杂问题的方法之一就是提供 简单的 抽象 。那么,抽象究竟表示什么意思? 这里的抽象 表示去除 无关信息 或隐藏细节信息,以减少问题复杂度的过程 。 一个典型的例子是:对于老司机开车这件事,我们只需要关心速度、油量等指标(数据表示);以及启动、换挡、踩油门、刹车、转方向盘、开闪光灯等操作过程(数据操作)。我们不需要知道发动机究竟怎么启动的,电路和管路是怎么布局的等问题。 因此,这里使用抽象的一个关键就是:尝试从用户的角度去考虑对象的构建,先去定义用户和对象的交互(即接口),再去想对象的内部数据和接口实现。 封装 封装(encapsulation) 是一种 OOP 特性。封装有多种含义,OOP 中的封装的语义是:将数据表示和数据操作,绑定到一个对象中,不能直接访问对象的数据,只能通过方法来访问或修改对象的数据

编译器默认实现的类成员函数

喜欢而已 提交于 2020-02-01 06:15:35
以下几种情况编译会生成类成员函数情况如下: # include <cassert> # include <complex> # include <iostream> // 编译器为我们实现了几个类成员函数? class Empty { } ; //Empty e; //Empty b=e; //Empty d; //Empty b=d; //Empty F(b); //Empty* operator&(); //取址运算符 //const Empty* operator&() const; //取址运算符(const版本) //有默认构造函数、拷贝构造函数、析构函数、赋值语句、取址运算符、取址运算符(const版本) // 编译器为我们实现了几个类成员函数? class AnotherEmpty : public Empty { } ; //有默认构造函数、拷贝构造函数、析构函数、赋值语句、取址运算符、取址运算符(const版本) //只是构造的时候会调用基类的构造函数 // 编译器为我们实现了几个类成员函数? class Void { public : Void ( ) { } } ; //拷贝构造函数、析构函数、赋值语句、取址运算符、取址运算符(const版本),除了构造函数 // 编译器为我们实现了几个类成员函数? class NotEmpty { public :

类的概念及品种(ing)

对着背影说爱祢 提交于 2020-01-31 17:38:28
虚函数: 在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。 纯虚函数: 在声明虚函数时被“初始化”为0的函数。 抽象类 :至少包含一个纯虚函数的类。 虚析构函数 :释放派生类的对象。 C++规定,当一个成员函数被声明为虚函数之后,其派生类中的同名函数都自动成为虚函数。记住 来源: CSDN 作者: 泰乐熊 链接: https://blog.csdn.net/xiong3110/article/details/87428461

MOOC,Java类与对象

倾然丶 夕夏残阳落幕 提交于 2020-01-30 20:01:59
定义在函数内部的变量:本地变量。 定义在函数外面的变量:成员变量。 成员变量定义初始化 1、成员变量在定义的地方就可以给出初始值。 2、没有给出初始值的成员变量会自动获得0值。 3、对象变量的0值表示没有管理任何对象,也可以主动给null值 4、定义初始化可以调用函数,甚至可以使用已经定义的成员变量。 构造函数: 如果有一个成员函数的名字和类的名字完全相同,则在创建这个类的每一个 对象的时候都会自动调用这个函数——构造函数。这个函数不能有返回类型。 来源: CSDN 作者: m n x j 链接: https://blog.csdn.net/qq_38054511/article/details/104116661

C++学习笔记第三天:类、虚函数、双冒号

断了今生、忘了曾经 提交于 2020-01-23 09:16:36
类 class Box { public: double length; // 盒子的长度 double breadth; // 盒子的宽度 double height; // 盒子的高度 }; 类成员的作用域: public:公共成员。访问权限:外部、子类、本身 protected:受保护成员。访问权限:子类、本身 private:私有成员。访问权限:本身 构造函数 跟其他语言一样,使用类名作为函数名,无返回值,可以有参数。 #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; //

C++类继承内存布局(三)

落爺英雄遲暮 提交于 2020-01-22 21:36:18
参考:http://blog.csdn.net/jiangyi711/article/details/4890889# (三)成员函数 类X中每一个非静态成员函数都会接受一个特殊的隐藏参数——this指针,类型为X* const 该指针在后台初始化为指向成员函数工作于其上的对象 在成员函数内,成员变量的访问是通过在后台计算与this指针的偏移来进行 struct P { int p1; void pf(); // new virtual void pvf(); // new }; 声明虚成员函数会造成对象实例占用更多的内存空间,因为虚成员函数需要虚函数表指针 声明非虚成员函数不会造成对象实例的任何内存开销 P:pf()的点定义: void P::pf() { // void P::pf([P *const this]) ++p1; // ++(this->p1); } P:pf()接收了一个隐藏的this指针参数,对每个成员函数的调用,编译器都会自动加上这个参数 在pf()函数内,对于成员变量的访问全部通过this指针进行, 有的继承层次下this指针需要调整,访问成员的开销会增大 1)覆盖成员函数 和成员变量一样,成员函数也会被继承。通过在派生类中重新定义基类函数,一个派生类可以覆盖基类函数定义 覆盖是静态的还是动态的依赖于成员函数是否被声明为虚函数 class A {

Kotlin学习(9)→类基础

瘦欲@ 提交于 2020-01-21 22:25:53
文章目录 1 、一个简单的动物类与init函数 2、类的构造函数 2.1 主构造函数 2.2 让类更加符合Kotlin风格 2.3 二级构造函数 2.4 构造函数的默认参数 3、成员属性和成员方法 4、伴生对象 5、总结 在期待着郭霖先生的《第一行代码(第三版)》时,意识到自己需要补充必要的Kotlin知识,现在通过写博客进行分享,争取拿到书之后早日上手。 使用的软件是IDEA 2019,文章中如有错误或者欠缺的地方,欢迎批评指正。 ( 参考书为《Kotlin从零到精通Android开发》,欧阳燊著,清华大学出版社2018年4月第一版,ISBN 978-7-302-49814-8)。感谢欧阳先生的优秀教材 。 1 、一个简单的动物类与init函数 根据之前其他语言的基础和Kotlin变量声明规则等,我们可以写一个很简单的动物类: class Animal { var name : String ? = null var age : String ? = null init { println ( "Animal: 这是个动物的类" ) } } 注意,Kotlin要求要么类中的非空成员属性(property)是抽象的(abstract),要么就要初始化。我们将动物的名字(name)和年龄(age)声明为可空类型,初始化为null,没有问题。 下面是一个函数init

C++ template

爷,独闯天下 提交于 2020-01-21 03:45:27
转自 http://www.cnblogs.com/assemble8086/archive/2011/10/02/2198308.html 一、类模板定义及实例化 1. 定义一个类模板: 1 template<class 模板参数表> 2 3 class 类名{ 4 5 // 类定义...... 6 7 }; 其中,template 是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是 类型参数 ,也可以是 非类型参数。 类型参数由关键字class或typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义中的一个常量。 例: 1 template<class type,int width> 2 3 //type为类型参数,width为非类型参数 4 5 class Graphics; 注意: (1) 如果在全局域中声明了与模板参数同名的变量,则该变量被隐藏掉。 (2) 模板参数名不能被当作类模板定义中类成员的名字。 (3) 同一个模板参数名在模板参数表中只能出现一次。 (4) 在不同的类模板或声明中,模板参数名可以被重复使用。 1 typedef string type; 2 3 template<class type,int width> 4 5 class Graphics 6 7 { 8 9 type node;/

CFileFind类成员函数IsDots, IsDirectory

别说谁变了你拦得住时间么 提交于 2020-01-20 16:51:14
IsDots检测.和.两个目录(缺省目录)。 .代表当前目录; …代表上一层目录; eg:程序当前目录: c:\windows\temp, . = c:\windows\temp; … = c:\windows; IsDirectory表明这是一个目录 遍历目录下文件时,需要过滤掉.和…这两个缺省目录。所以由CFileFind对象引用IsDots的意思是:这是一个目录并且不是这个目录本身或者上层目录。 void Recurse ( LPCTSTR pstr ) // 设置一个目录,比如:"c:\\windows" { CFileFind finder ; CString sPath ( pstr ) ; sPath + = _T ( "\\*.*" ) ; BOOL bWorking = finder . FindFile ( sPath ) ; while ( bWorking ) { bWorking = finder . FindNextFile ( ) ; // 跳过 . 和 .. ; 否则会陷入无限循环中!!! if ( finder . IsDots ( ) ) continue ; // 如果是目录,进入搜索 (递归ing)!!! if ( finder . IsDirectory ( ) ) { CString str = finder . GetFilePath

c++类的定义及类成员的访问控制

时间秒杀一切 提交于 2020-01-20 01:59:25
类的定义 在c++中,类的定义方法如下 class 类名{ 访问范围说明符: 成员变量1 成员变量2 成员函数声明1 成员函数声明2 访问范围说明符: 更多成员变量 更多成员函数声明 ... }; 类的定义要以 ; 结束。 类的基本思想是数据抽象和封装。数据抽象是一种把接口和实现分离的编程技术。类的接口包括用户所能够执行的操作,类的实现包括类的数据成员、负责接口实现的函数体和各种私有函数。 封装实现了类的接口和实现的分离。封装隐藏了类的实现,封装过后,用户只能访问类的接口,而不能访问类的实现。 类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整体。例如一个日常生活时间类,时间对象有两个属性,小时和分钟,根据需要应该能够对每个日常事务所花的时间进行操作和显示。操作和显示就需要类的接口函数。 一般的类由两部分组成: 1.类声明:以数据成员的方式描述数据部分,以成员函数(被称为方法)的方式描述接口函数。 2.类方法定义:描述如何实现类成员函数。 简单地说,类声明给出了类的框架,而方法定义给出了类的细节。 类成员的访问控制 在定义一个类时可以规定外界对其成员的访问权限,访问权限的含义如下: (1)public(公有的):公有成员可被与该类对象处在同一作用域内的任何函数访问。 (2)private(私有的):私有成员只能被类中的成员函数及该类的友元函数访问