类和数据抽象

1、类成员

class Bag{public:int book_nums;int book_type;vector<string> book_name;bool Fetch_book(int book_num,string book_name);Bag(){}
private:double book_value;
}**;/*类成员包括数据成员和成员函数,还有与类同名的构造函数,类内定义的成员函数都是inline类型,在类成员函数的声明处或定义处指定inline都是合法的。类的每个成员都有自己的访问标号,声明为public的成员可以在类外进行访问,
而声明为private的成员不可以在类外部访问。若不指定访问标号,用struct关键词定义的类其所有成员都是public类型,class则默认为private。*/**
class pig;//如果只是这样声明了一个类,而没有定义,此时pig为一个不完全类型,只能创建这种类型的引用或指针,一旦类名出现就认为该类已声明,定义具体类型的对象时才会分配内存空间。

2、this指针

成员函数具有一个隐含的形参-this指针,该形参只能由编译器隐含的定义,可以显示的使用改指针。一般需要将一个对象作为整体引用而不是引用某一个成员时才会显示的使用this指针。还可以返回*this,返回调用自己的那个对象。在普通的非const成员函数中,this是指向类类型的const指针,可以改变其指向的值,但不能改变其保存的地址。而const成员函数的this是一个指向const类型的const指针,既不能改变它所指的对象,也不能改变它所保存的地址。

class TV{public :TV& Show_movie();TV& Show_dance();const TV& Show_news(int num) ;
};
//下面的用法是正确的
TV myTV;
myTV.Show_movie().Show_dance();
//错误用法,**myTV.Show_news()返回指向const类型的const指针**
myTV.Show_news().Show_dance();
//基于const可以实现成员函数的重载可以解决上面嵌入调用的问题,重载还可以有其他方法,可以如下定义成员函数
class TV{public :TV& Show_movie();TV& Show_dance();const TV& Show_news(int num) const;TV& Show_news(int num);
};
myTV.Show_news().Show_dance();/*这样就不会出错了,当类中出现基于const重载的成员函数时,
const对象只能调用const成员函数,而非const对象可以调用任何一个,同时在成员函数末尾加上const表明该成员函数不能修改类成员*/

关于成员函数与const更详细的介绍,可以参考这位博主的文章:
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接

3、可变数据成员

一个可变数据成员永远不会是const,即使他是const对象的数据成员(不能修改const对象的数据成语,可变数据成员除外)。

//如下声明一个可变数据成员
mutable data;

一个const成员函数可以改变一个可变成员的值。

4、友元

一个类的友元函数有如下形式:

class{friend void Friends();
};

一个类的友元可以是类或者函数,函数可以是普通的函数或者某个类的成员函数。
如下:
友元的声明只能出现在类的内部,不受访问标识符的限制。
友元不具有传递性,如果一个类将Game_Character类声明为友元类,Game_Character类的友元也不能访问该类的私有成员。
如果想将所有的重载函数声明为友元,需要分别对这些重载函数进行声明。
类和成员函数的声明不是必须放在它们的友元声明之前,当一个名字第一次出现在一个友元声明中时,我们隐式的假设该名字在当前作用域中是可见的,然而友元本身不一定就真地声明在当前作用域中,即使在类的内部定义该函数,也必须在类的外部提供相应的声明。

4、构造函数

构造函数与类同名,无返回值。构造函数初始化类中的数据成员,只有static数据成员和const数据成员才直接初始化。只要类对象被创建就会执行构造函数,如果没有构造函数,编译器会自动合成一个构造函数。
1、构造函数初始值列表,如下所示:
**如果没有在构造函数的初始值列表中现实的初始化成员,则该成员将在执行构造函数体之前执行默认初始化,有时候可以忽略赋值和成员初始化的区别,但如果数据成员元是const或者引用、或者属于某种没有定义默认构造函数的类类型时,必须要在初始化列表中进行初始化。**图中注释掉的构造函数的效果和采用初始值列表进行初始化的构造函数的效果是一样的,但注释掉的构造函数是对数据成员执行了赋值操作,两个不能同时存在。
2、成员初始化的顺序:
构造函数初始值列表只说明用于初始化成员的值,而不限定初始化执行的顺序,初始化顺序与类中成员定义的顺序一致。

class X{int i;int j;
public:X(int val):j(val),i(j){}
};

上面的写法是错误的,j在i之后定义,j在i之后初始化。

如果一个构造函数为所有参数都提供了默认实参,那么它实际上也定义了默认构造函数。
3、委托构造函数
C++11 扩展了构造函数初始值的功能,我们可以定义委托构造函数。
如下图所示:
这两个委托构造函数都将初始化委托给了默认构造函数。但是在构造类时会存在二义性,第二个委托构造函数与默认构造函数冲突,当类被默认初始化或值初始化时自动执行默认构造函数。
默认初始化的情形:
在块作用域内不使用任何初始值定义一个非静态变量或者数组
当一个类本身含有类类型成员且使用合成的默认构造
当类类型的成员没有在构造函数初始值列表中显式地初始化
值初始化:
数组初始化过程中,我们提供的初始值的数量少于数组的大小
当我们不使用初始值定义一个局部静态变量时
采用形如T()这样的表达式请求显式地值初始化
5、隐式的类类型转换

class Data{}int content;string isbn;double value;explicit Data(double val):value(val){}Data(string  isbn):ISBN(isbn){}
;
void Add_Data(Data data1);
string isbn ="hello";
Add_Data(isbn);//隐式的类类型转换,这会产生一个临时对象

如上代码所示发生了隐式的类类型转换,编译器只会执行一步类型转换。
如果直接将“hello”传给Add_Data函数会出错。将构造函数声明为 explicit 可以阻止这种转换。 传给Add_Data double 类型的参数就不会发生这种转换。这个关键字只对一个参数的构造函数有效,需要多个参数的构造函数不能用于执行隐式的类类型转换。
explicit 构造函数只能用于直接初始化,但仍然可以采用强制类型转化:

Add_Data(Data(isbn));
Add_Data(static_cast<Data>(isbn));

6、类的静态成员
静态成员不属于类的一个对象,它们并不是在创建类的对象时被定义的,这表明它们不能由类的构造函数进行初始化,一般不能在类的内部初始化静态成员,相反必须在类的外部定义和初始化每个静态成员。

但仍然可以用类的对象、引用或者指针来访问静态成员,成员函数不使用作用域运算符就能访问静态成员,定义静态成员成员时,static关键字只出现在类内部的声明中,在类外定义时不能重复该关键字。
静态成员的类内初始化
可以为静态成员提供const 整数类型的类内初始值,要求静态成员必须是字面值常量类型的constexpr,初始值必须是常量表达式。静态数据成员可以是不完全类型,并且静态成员可以作为默认参数,普通成员由于是类的一部分,不能作为默认参数。

拷贝控制

当定义一个类时,我们显式或隐式地指定在此类对象拷贝、移动、赋值和销毁时做什么,一个类通过定义五种特殊的成员函数来控制这些操作,包括拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符以及析构函数。
1、拷贝构造函数
如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,那么它是拷贝构造函数,拷贝构造函数的第一个参数必须是一个引用类型。它在几种情况下会隐式地使用,因此它通常不应该是explicit的。如果一个类没有定义拷贝构造,编译器会定义一个合成拷贝构造函数,合成拷贝构造函数会将参数的成员逐个拷贝到正在创建的对象中。

class Foo{public:Foo();//默认构造Foo(const Foo&);//拷贝构造
};

C++支持列表初始化、默认初始化以及拷贝初始化。用=进行的初始化称为拷贝初始化,默认初始化后所获得的默认值取决于变量的类型,拷贝初始化通常由拷贝构造函数来完成,但是如果一个类有移动构造函数,则拷贝初始化有时候会使用移动构造函数来完成。拷贝初始化会在以下情况发生:
①:将一个对象作为实参传递给一个非引用类型的形参
②:从一个返回类型为非引用类型的函数返回一个对象
③:用花括号列表初始化一个数组中的元素或一个聚合类中的成员

C++ 面向对象编程基础相关推荐

  1. [.net 面向对象编程基础] (18) 泛型

    [.net 面向对象编程基础] (18) 泛型 上一节我们说到了两种数据类型数组和集合,数组是指包含同一类型的多个元素,集合是指.net中提供数据存储和检索的专用类. 数组使用前需要先指定大小,并且检 ...

  2. [Java入门笔记] 面向对象编程基础(二):方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...

  3. matlab面向对象排序,matlab面向对象编程基础

    matlab面向对象编程基础 觉得有用的话,欢迎一起讨论相互学习~ Matlab面向对象大体结构 类定义的普通模板 代码清单2.1.1 classdef className properties pr ...

  4. Day08 - 面向对象编程基础

    面向对象编程基础 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编程",我们先来看看比较正式的说法. 把一组数 ...

  5. python编程基础是什么-Python面向对象编程基础解析(一)

    1.什么是面向对象 面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由对象构成的.应用在编程中,是一种开发程序的方法,它将对象作为程序的基本单元. 2.面向 ...

  6. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性--多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  7. Java面向对象编程(基础部分)

    面向对象编程(基础部分) 类与对象 01: public class ObjectWorkDemo {public static void main(String[] args){Cat cat1 = ...

  8. java 168转换成861_java实验-java语言面向对象编程基础

    java实验-java语言面向对象编程基础 (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 8.90 积分 广州大学学生实验报告广州大学学生实验报告 ...

  9. java面向对象程序_面向对象编程基础(java)

    面向对象编程基础 1.1 面向对象概述 在程序开发初期,大家使用的是结构化开发语言,也就是面向过程(opp),但随着市场需求剧增,软件的规模也越来越大,结构化语言的弊端也暴露出来. 开发周期无休止的拖 ...

  10. [.net 面向对象编程基础] (22) 事件

    [.net 面向对象编程基础] (22)  事件 事件(Event)是学习.net面向对象编程很重要的一部分,在学习事件之前,我们实际上已经在很多地方使用了事件,比如控件的click事件等,这些都是. ...

最新文章

  1. shell脚本编写知识2
  2. JScrollPane 滚动处理
  3. 安装Python3的工具包报Microsoft Visual C++ 14.0 is required的错误
  4. 丘成桐:年轻学者要敢于“无法无天”
  5. vue PC端国际化一站式解决方案
  6. 连通块(信息学奥赛一本通-T1335)
  7. mysql 数据库异常_Mysql连接数据库异常汇总【必收藏】
  8. 快速接入阿里云应用配置管理工具 轻松开启企业效率新时代
  9. 字符串匹配问题 ----- Rabin-Karp算法
  10. C# WPD PortableDeviceApiLib获取便携设备列表
  11. Leetcode—6.相向双指针的剩余题型python解答
  12. MySQL数据表类型及文件结构
  13. 北复交浙科哈航邮中上科保研之路
  14. 台式win10系统你要来自Trustedinstaller的权限才能对此文件进行更改?
  15. 滚动轴承特征频率计算推导过程
  16. JAVA名片注册_JavaWeb练习-网上名片管理系统
  17. 电影▍更多的《复仇者联盟4:终局之战》剧透描述了令人心碎的超级英雄死亡...
  18. MongoDB 实战教程:数据库与集合的 CRUD 操作篇
  19. grindstone+晨间日记——完美管理我的时间
  20. 2023最新IDEA下载安装教程

热门文章

  1. putty怎么进入文件夹_如何利用putty工具上传文件 - 卡饭网
  2. 七天学会javascript之动态删除某行(44)
  3. win10安装mysql(win10安装不了软件怎么办)
  4. 一个深圳高级女白领的真实世界(3) ----李白有诗云:"轻舟已过万重山"
  5. 关于视觉重定位(VPS)的工作经验分享
  6. 开启混合睡眠 解决Hybrid Sleep The hypervisor does not support this standby statewindows
  7. Google Colab 免费GPU服务器使用教程
  8. 人脸识别技术的优缺点
  9. 网络相关知识总结-就挺全的
  10. OPPPO A32更新ColorOS版本V11.1后无法进行Debug模式