c++一些概念
面向对象语言三大特征:
封装,多态,继承
封装:
1、将函数定义到结构体内部,就是封装.
2、编译器会自动传递结构体的指针给函数.
类:
带有函数的结构体,称为类.
成员函数:
结构体里面的函数,称为成员函数.
this指针:
c++中默认传递一个对象首地址,这个地址就是this指针
thie指针特点
1、你用或者不用,它就在那里
2、参数个数确定的时候,用ecx来传递
3、参数个数不确定的时候,最后一个传递(参见不定长参数)
4、this指针不能做++ -- 等运算,不能重新被赋值.
5、this指针不占用结构体的宽度.
构造函数的特点:
1、与类同名
2、没有返回值(指的是前面连void都不能有)
3、创建对象的时候执行
4、主要用于初始化
5、可以有多个(最好有一个无参的),称为重载 其他函数也可以重载
6、编译器不要求必须提供
析构函数的特点:
1、只能有一个析构函数,不能重载
2、不能带任何参数
3、不能带返回值
4、主要用于清理工作
5、编译器不要求必须提供
6. 不需要自己调用该函数,编译器自己帮我们最后执行
在函数名前面加一个~,表示是析构函数
继承
1、什么是继承?
继承就是数据的复制
2、为什么要用继承?
减少重复代码的编写
如果是Teacher、Student继承了Person
3、Person 称为父类或者基类
4、Teacher、Student称为子类或者派生类
Student s Person t
5、t和s可以称为对象或者实例.
6、可以用父类指针指向子类的对象.(绝对安全)
多层继承:允许多重继承,即子—>父—->爷(s->t->v)
如果子和父中有相同变量(a) 使用 s::a t::a 来告诉编译器这个a到底是谁的参数
多重继承:(微软不推荐,给编译器工作增大)
即有多个父类
struct Z:X,Y
权限控制
将定义与实现分开:
将定义与实现分离,代码会有更好的可读性
可以在头文件中 写上类中变量,函数申明
在.cpp文件中写上函数具体实现 xx::FunctionName 表示这个函数名是xx类里面的
1、xxx.h 只是一个文件,可以是任何的后缀名,如果你愿意,
2、#include 的作用只是把里面的内容复制过来 仅此而已.
如:#include "abc.exe"
3、xxx.h 与 xxx.cpp并不要求一定同名
public private的使用
public的意思是,这个成员哪里都可以用,不用担心被修改,所以,一旦发布成public的成员,是不能(不应该)够改名字的.
private的意思是,这个成员只用于(类的)内部使用,不要在其他的地方使用.
1、对外提供的函数或者变量,发布成public的 但不能随意改动.
2、可能会变动的函数或者变量,定义成private的 这样编译器会在使用的时候做检测.
3、只有结构体内部的函数才可以访问private的成员.
4、public/private可以修饰函数也可以修饰变量.
private真的不能访问吗?
使用private只是在编译器层面上限制访问 在底层 汇编角度来说 有没有private反汇编代码都是一样的
所以我们使用指针同样可以访问
private修饰的成员与普通的成员没有区别 只是编译器会检测.
private修饰的成员只要自己的其他成员才能访问
class与struct的区别
成员区别
编译器默认class中的成员为private 而struct中的成员为public
继承区别
父类中的程序继承后默认变成private属性
如果不希望改变成员的属性:
class Sub:public Base
填上public,否则默认private
继承的时候会先执行父辈的构造函数
private是否被继承
1、父类中的私有成员是会被继承的
2、只是编译器不允许直接进行访问
用指针访问
虚函数表
1、通过对象调用时,virtual函数与普通函数都是E8 Call
2、通过指针调用时,virtual函数是FF Call,也就是间接Call
1、当类中有虚函数时,会多一个属性,4个字节
2、多出的属性是一个地址,指向一张表,里面存储了所有虚函数的地址
绑定
绑定就是将函数调用与地址关联起来.
前期绑定/静态绑定:编译完时就已经绑定
后期绑定/动态绑定:在调用时才绑定,有虚表,virtual虚函数
1、只有virtual的函数是动态绑定.
2、动态绑定还有一个名字:多态
重载
两个重载函数必须在下列一个或两个方面有所区别:
1、函数的参数个数不同。
2、函数的参数类型不同或者参数类型顺序不同
重写(覆盖)
重写(覆盖):是指派生类(子类)中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类(父类)中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。
多态:
1.动态绑定
2.体现出了不同的行为
模板:
使用template<class T>来声明一个模板
T是未确定的类型,让我们可以使用不同的类型
引用类型
我们日常使用指针时,有可能一些意外的操作,将本不该指向的地址作为了指针的值,这样有不安全的风险,使用"引用" int& x; 就是讲指针中的* 改为& ,这样设计的好处在于:编译器不让你改这个指针的地址,增强了安全性
但从底层来说,汇编代码没有区别,实际上就是编译器限制你修改
使用x = 10; 来直接给x这个地址中的值赋值 ,而不是修改地址
1、引用类型是C++里面的类型
2、引用类型只能赋值一次,不能重新赋值
3、引用只是变量的一个别名,使用的时候按照变量去使用
4、引用可以理解成是编译器维护的一个指针,但并不占用空间
5、使用引用可以像指针那样去访问、修改对象的内容,但更加安全.
友元函数
friend void Print(const Person& refPer);
在类中函数前添加一个friend,表示该函数为该类的朋友
这样这个函数也可以访问类的私有成员
(也可以定义一个友元类)
什么情况下需要友元函数:
(1) 运算符重载的某些场合需要使用友元.
(2) 两个类要共享数据的时候.
友元函数和类的成员函数的区别:
(1) 成员函数有this指针,而友元函数没有this指针
(2) 友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友
运算符重载:
有时需要一些针对特定类型进行操作的运算符
Number operator+(const Number& p);
1、运算符重载就是函数替换
2、. :: ?: sizeof # 不能重载
new delete
是c++中的在堆中分配空间,释放空间的关键词
在底层,与malloc free没有区别,都是调用的系统API kenel32这个dll中的 heapalloc 和heapfree
在使用时,new int[10] 对应的是delete[] 方括号里不需要写值
否则只会释放数组中的一个单元,本质delete是用一个循环free
Vector(动态数组)
1、本质就是一个数组
2、可以动态扩充容量
3、支持下标方法,查询性能好
4、新增数据和删除数据较差
链表:
特点:
1、数据分散存储
2、查询性能没有Vector好
3、新增与删除的性能好于Vector
有单向链表,循环链表,双向链表
c++一些概念的更多相关文章
- 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念
一.前言 DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
集群概念介绍(一)) 白宁超 2015年7月16日 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习 ...
- 声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS
需要做个音频的PPM表,看着一堆的音频术语真是懵了,苦苦在网上扒了几天的文档,终于有了点收获,下面关于声音的分贝做个总结. 分贝 Decibel 分贝(dB)是一个对数单位(logarithmic u ...
- js面向对象学习 - 对象概念及创建对象
原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...
- 【Linux大系】Linux的概念与体系
感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 我在这一系列文章中阐述Linux的基 本概念.Linux操作系统继承自UNIX.一个操作系统是一套控制和使用计算 ...
- KOTLIN开发语言文档(官方文档) -- 2.基本概念
网页链接:https://kotlinlang.org/docs/reference/basic-types.html 2. 基本概念 2.1. 基本类型 从可以在任何变量处理调用成员函数和属性 ...
- .NET面试题系列[5] - 垃圾回收:概念与策略
面试出现频率:经常出现,但通常不会问的十分深入.通常来说,看完我这篇文章就足够应付面试了.面试时主要考察垃圾回收的基本概念,标记-压缩算法,以及对于微软的垃圾回收模板的理解.知道什么时候需要继承IDi ...
- 《徐徐道来话Java》(1):泛型的基本概念
泛型是一种编程范式(Programming Paradigm),是为了效率和重用性产生的.由Alexander Stepanov(C++标准库主要设计师)和David Musser(伦斯勒理工学院CS ...
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
随机推荐
- redux & multi dispatch & async await
redux & multi dispatch & async await 同时发送多个 action, 怎么保证按序返回数据 dispatch multi actions http:/ ...
- 为什么空投总是抢不到?大神教你狂撸SPC!
为什么空投总是抢不到?你是否总有这样的疑虑.明明现在区块链市场中空投项目这么多,明明身边的朋友都抢到了空投,明明人家都已经躺赚百万千万,为何只有我,什么都没抢到.今天,本文将教你如何抢空投,成为下一个 ...
- Simple: SQLite3 中文结巴分词插件
一年前开发 simple 分词器,实现了微信在两篇文章中描述的,基于 SQLite 支持中文和拼音的搜索方案.具体背景参见这篇文章.项目发布后受到了一些朋友的关注,后续也发布了一些改进,提升了项目易用 ...
- C# 类中操作主窗体控件
主窗体程序: using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat ...
- Information:java: javacTask: 源发行版 8 需要目标发行版 1.8
原文链接:https://blog.csdn.net/idiot_qi/article/details/105149846 创建新maven项目跑main,出现这个编译异常 网上找了找,记录一下以备不 ...
- VMware vSphere 虚拟化平台的安装及使用
首先解释一下这些名词, vSphere是什么? vSphere 是VMware公司发布的一整套产品包,是VMware公司推出的一套服务器虚拟化解决方案,包含VMware ESXi hypervisor ...
- Gc root 定义
常说的GC(Garbage Collector) roots,特指的是垃圾收集器(Garbage Collector)的对象,GC会收集那些不是GC roots且没有被GC roots引用的对象.一个 ...
- Coposition 详解
LifeCycle Hooks 在新版的生命周期函数,可以按需导入到组件中,且只能在setup()函数中使用. import { onMounted, onUnmounted } from 'vue' ...
- 【python3.x】发送自动化测试报告邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.python的smtplib提供了 ...
- KeyboardDemo - Android身份证号、车牌号快捷输入键盘
Android身份证号.车牌号快捷输入键盘 项目地址 Github 键盘部分在 keyboard module 中 键盘与EditText绑定参照 MainActivity