C++小总结

  1.C与C++的简单区别

    1.建立的文件类型不一样,C语言是.c,C++是.cpp

    2.引入的头文件不一样

    3.C++有命名空间

    4.输入输出语句不一样

    5.C语言不允许重载,C++可以重载

    6.自定义类型,C语言使用struct,C++使用class

    7.C语言面向过程,C++面向对象

  2.初识类与对象

  C++的四个特征:抽象,继承,封装,多态

  抽象:对具体事务的定义过程称之为抽象过程

  封装:把数据和数据的操作方法捆绑在一起的过程

  多态:同一种事务有多种形态的表现

  支持继承和多态的语言都称为面向对象的语言

  类就是计算机对现实实体抽象类别的一个描述,所创建的实例就是对象

  3.类的定义与创建

  类是C++中的一种数据类型

  C++的对象:类所定义的变量

  实例化:定义对象的过程

  访问限定符:public,protected,private

  如果在类起点没有访问限定符,则系统默认为私有的

  访问限定符protected和private体现了类的封装性

  类没有空间,所以要先实例化对象,为对象分配空间

  4.this指针

  类的大小:相应数据成员大小(与字节对齐有关),不包括方法

  this指针代表当前的对象

  this指针只有在对象调动方法时在函数位置隐藏插入一个this指针。

  C++对类的识别顺序:1.类名 2.识别数据成员(无论是公有成员还是私有成员)3.识别方法(函数)所以数据成员的位置可以任意

  改写函数:添加一个参数,类名 *const this  //用const封锁指针,this的指向不能改变

  对象调用这个方法时也会被改写,第一个参数实际上是对象的地址。

  5.构造函数和析构函数

  只有通过公有的方法才能对私有的数据成员进行访问

  构造函数:数据成员多为私有,要对他们进行初始化,必须要用一个公有函数来执行,这个函数仅在定义对象的时候执行一次。

  构造函数函数名与类名相同,无返回类型说明,在程序运行时,当新的对象被建立,该对象所属的类的构造函数被自动调用,该生存期也只调用这一次。构造函数可以重载。如果类说明中没有给出构造函数,则C++编译器自动给出一个缺省的构造函数。但是只要定义了一个构造函数,系统就不会生成缺省的构造函数。

  区分:  Test t1;     //实例化对象

      Test t1(); //函数声明

  析构函数:注销该对象并进行善后工作。

  先构造的后析构(构造的对象生成在栈区,所以符合栈先进后出的特点)

  析构函数无返回值无参数,一个类只有一个析构函数。

  析构函数可以缺省,对象注销时,系统自动调用析构函数。

  6.构造函数的三个作用

  1.构造对象

  2.初始化对象

  3.类型转换(与能否生成中间变量有关)

  只要类型不一样,永远都不能赋值。

  关键字explicit:不允许隐式转换(显示转换关键字)放在构造函数声明之前

  7.引用(别名)

  引用避免函数的副作用,也避免为实参对象重新分配内存的引起的程序执行效率的大大降低。

  引用的几种情况:  

1.对变量的引用:

Int a=10;

Int &b=a;

2.对指针的引用:

Int *p=&a;

Int *&q=p;

3.对数组的引用:

Int ar[10]={1,2,3,4,5,6,7,8,9,10};

Int (&br)[10]=ar;    //注意不能写int &br[10]=ar;  这样写表示的把数 组赋给是数组元素的引用

不能用非const成员变量引用一个const成员变量:

Const int x=100;

Int &y=x;    //错误的示例 正确做法:const int &y=x;但是可以用const成员变量引用一个非const成员变量

4.另一种情况

Const double d=12.34;

Const int &f=d;   //可以正常编译,但是行为比较诡异。导致了f和d的地址不是一个。原因是f的地址并非引用了d的地址而是引用了临时变量的地址,而这个临时变量是int类型。这会使程序出现错误。

5.const double d=12.34;

Int& f=d;  //程序编译错误,原因是临时变量具有常性,临时变量给f赋值相当于const成员变量给非const成员变量赋值,这是不允许的

  8.拷贝构造函数

  拷贝只需要拷贝数据成员,而函数成员是公有的

  用已存在的对象初始化另外一个对象(没调动构造函数,调动拷贝构造函数)

  以类名作为函数名,以自身类型参数的引用做参数

  如果把一个真实的类对象作为参数传递到拷贝构造函数,会引起无穷递归,因此要用引用。分析:不使用引用传递而使用值传递时,需要为实参拷贝构造一个临时变量,拷贝构造的实参又需要拷贝构造,因此会出现无穷递归的情景,这会导致栈溢出,使程序崩溃。

  易错点:

    Test t;

    Test t2=t;  //注意调用的是拷贝构造函数

    Test t3;

    t3=t;     //注意调用的是赋值函数

    拷贝构造函数的三个作用:

    1.对象初始化对象

    2.当函数的形参是类对象时,调用函数时进行实参与形参的结合时使用,这时要在内存新建立一个局部对象,在返回调用者

    函数的返回机制:我们所认为返回的值是局部变量,出了作用域就会消亡。C++和C语言返回的其实是临时对象。即创建一个中间的临时变量,把要返回的值拷贝到临时变量。一旦返回,要返回的那个变量就会消亡(该临时变量的生存周期只在函数调用处的表达式处)。返回的这个临时变量一旦给变量赋值后就会被析构。

  临时变量是局部的,返回创建的临时变量。

  9.赋值函数

  使用引用的好处:1.不再调用拷贝构造函数,效率提高2.不再为其开辟空间节省了内存

  常引用的好处:保护参数,使参数的值不能改变

  使用引用常忽略的一个问题:分析以下的程序:以引用返回,即不再创建临时的无名对象,返回的就是真实的对tmp的一个引用,但由于tmp是一个临时的对象,一旦函数执行结束,这个tmp就会被析构掉,当主程序中执行一个Test t2;t2=fun(t1)时,由于t1已经析构,所以t2的数据就会变成一个错误的值。因此要注意引用的使用。

  Test& Fun(Test x)

  {

    int value;

    value=x.Getdata();  //一个成员函数

    Test tmp(value);

    return tmp;

  }

  当返回值不受作用域的影响(如指针)时,考虑用引用

  10.函数的调用优化

    1.将Test tmp(value);

      return tmp;

    改为

      return tmp(value);   //创建了一个临时的无名对象

    减少了拷贝构造函数和析构拷贝构造所构造的临时变量的过程(return无名临时对象时减少了一次拷贝和析构,是编译器进行的优化)

    2.参数以引用方式传递,不再为参数进行临时对象的拷贝构造,而是直接操作原对象,并且不为参数开辟空间。

    3.返回值一引用的方式返回,但是得注意返回值必须不受作用域限制

  4.将 Test t1(100);

     Test t2;

     t2=fun(t1);

    改为:

    Test t1(100);

    Test t2=fun(t1);

    t2不是赋值(变成初始化),减去赋值函数的调用,也不用调用拷贝构造了(编译器认为函数返回的临时对象就是t2,因此省去了拷贝构造,是编译器做的优化)

  11.深浅拷贝

  六个默认的函数:构造函数,拷贝构造函数,赋值函数,析构函数,一般对象的取地址运算符的重载,常对象取地址运算符的重载

  如果一个类中数据成员包含指针,一般要重新写拷贝构造函数和赋值函数,光靠默认的拷贝构造函数是无法解决深浅拷贝的问题。

  同一个空间不能释放多次

  浅拷贝:只是将指针拷贝,而没有做实质的内容拷贝

  深拷贝:不只是单纯的只拷贝指针的指向,而是复制出一个相同的空间,并把值传给这个空间

  12.运算符重载

  C++中不可以重载的运算符为:三目条件运算符,成员.操作符,作用域操作符,sizeof

  13.友元

  一个常规的成员函数声明描述了三件在逻辑上互不相同的事情:

  1.该函数能访问类声明的私有部分

  2.该函数位于类的作用域中

  3.该函数必须经由一个对象去激活(有一个this指针)

  通过将该函数声明为static,可以让他只有前两个性质。通过建一个函数声明为友元可以只让他具有第一种性质(访问类声明中的私有部分)。

  友元可以在类的内部实现,也可以在类的外部实现,他的调动不在需要有对象激活。友元在一定程度上破坏了类的封装性。

  友元函数注意点:

  1.友元函数不是函数,但是友元函数可以访问类中所有成员,一般函数只能访问类中的共有成员。

  2.友元函数不受类中访问权限关键字限制,可以把它放在类的公有,私有,保护部分,结果一样。

  

时间: 2024-10-14 05:06:22

C++小总结的相关文章

微信小程序--图片相关问题合辑

图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.previewImage预览图片 微信小程序之预览图片 小程序开发:上传图片到腾讯云 .NET开发微信小程序-上传图片到服务器 微信小程序本地图片处理--按屏幕尺寸插入图片 [微信小程序]上传图片到阿里云OSS Python Flask小程序文件(图片)上传技巧 小程序图片上传阿里OSS使用方法 微信小程序问题汇

微信小程序——豆瓣电影——(2):小程序运行部署

Demo 预览 演示视频(流量预警 2.64MB) GitHub Repo 地址 仓库地址:https://github.com/zce/weapp-demo 使用步骤 将仓库克隆到本地: bash $ git clone https://github.com/zce/weapp-demo.git weapp-douban --depth 1 $ cd weapp-douban 打开微信Web开放者工具(注意:必须是0.9.092300版本) 必须是0.9.092300版本,之前的版本不能保证正

微信小程序开发初探

一.关于微信小程序 1.1 小程序诞生的背景 张小龙说道: (1)一切以用户价值为依归→用户是微信的核心,所以微信中没有很多与客户无关的功能,比如QQ中的乱七八糟一系列东西. (2)让创造发挥价值→所有围绕微信的创造比如公众号都应该发挥其应有的价值. (3)用完即走的高效服务→这一点就厉害了word天,微信要打造一个以微信为中心的生态链,不以绑定用户为目标.比如生活中有一些不太常用的app,我们可能一年也使用不了几次,但是有时候就需要用到,微信就想要提供这样一个平台,让你可以在微信中使用这中所谓

微信小程序连接Tornado

自己搭建Tornado 监听8000端口, 提供给小程序访问的地址为http://127.0.0.1:8000/index #!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): print('GET方式请求成功') self.write("123"

【小程序】获取微信 自带的 收货地址获取和整理

1.wx.chooseAddress(OBJECT) if(wx.chooseAddress){ wx.chooseAddress({ success: function (res) { console.log(JSON.stringify(res)) }, fail: function(err){ console.log(JSON.stringify(err)) } }) }else{ console.log('当前微信版本不支持chooseAddress'); } 2.数据处理,仅供参考 /

微信小程序学习总结(2)------- 之for循环,绑定点击事件

最近公司有小程序的项目,本人有幸参与其中,一个项目做下来感觉受益匪浅,与大家做下分享,欢迎沟通交流互相学习. 先说一下此次项目本人体会较深的几个关键点:微信地图.用户静默授权.用户弹窗授权.微信充值等等. 言归正传,今天分享我遇到的关于wx:for循环绑定数据的一个tips:  1. 想必大家的都知道wx:for,如下就不用我啰嗦了: <view class="myNew" wx:for="{{list}}">{{item.title}}<view

微领地小蜜app模式系统开发详解

如今企业竞争的最高境界, 不再是产品的竞争.人才的竞争.营销的竞争-- 而是一种商业模式(即赢利模式)的竞争. 微领地小蜜软件,微领地小蜜系统,小蜜APP,微领地小蜜平台,微领地小蜜开发公司,微领地小蜜服务模式,微领地小蜜商圈.O2O.C2B.B2C.F2C.B2B.C2N.C2C等微商城.App.手机网页.PC商城.小程序,微商管理系统.一物一码.防伪防窜.扫码红包.质量追溯.分销.全返.分红.拼团.互联网+直播+定制服务·系统开发提供中心. 回首过去,创新与发展裹带着机遇和挑战,微领地小蜜在

手机上也可以用的快手和火山小视频提取工具

之前分享过一个火山无水印视频提取软件,但是需要安装到电脑上,很多人觉得很麻烦. 今天分享个网页版,无需安装,并且电脑和手机都可以用的视频提取工具,支持提取快手和火山小视频里的任何视频,就连火山小视频里那种<作者不允许他人下载>的视频都可以解析,并且解析出来的视频都是没有水印的.(是不是觉得这工具特别赞,觉得赞的话,给我的文章点个赞吧??) 工具地址: 快手视频解析下载:http://kuaishou.iiilab.com/ 火山小视频解析下载:http://huoshan.iiilab.com

自制linux小系统

自制linux 今天说一说怎么自制一个linux,也就是用一块新硬盘来自己搞一个linux.硬盘拆掉撞到其他机器上可以照常使用,需要什么东西都是自己添加的哦. 那我就在虚拟机里进行了嘿嘿嘿... 1.在我的centos里加了一块新的硬盘并顺便分了个区,并且格式化了一下. [[email protected] ~]# fdisk /dev/sdb WARNING: DOS-compatible mode is deprecated. It's strongly recom mended to   

微信小程序之使用本地接口开发

本文主要讲解如何使用本地接口进行开发,很多人都会遇到这个问题,特别是小程序上线后. 一.解决思路 在小程序开发工具设置网络代理,然后再通过Charles设置代理,将https域名转为本地接口进行访问. 以下示例的环境为win7 + 老版本的微信开发工具 二.准备工作 1.配置https域名 为小程序配置request合法域名,在登录公众号平台去设置. 2.安装Charles 下载地址:https://www.charlesproxy.com/download/ 三.配置Charles 1.安装根