C++知识点小结 (二)

一、拷贝构造函数

  • 1、是一种特殊的构造函数,就是用一个已有的对象去构造其同类的副本对象,即对象克隆
  class 类名
  {
   类名(类名& that)
   {
    对成员挨个赋值
   }
  } 
  • 2、编译器会默认生成一个拷贝构造函数

    编译生成的拷贝构造函数默认会逐字节复制类中的每一个成员

    如果在类A中有类B成员,会在类A的拷贝构造中自动调用类B的拷贝构造

  • 3、程序员可以自定义拷贝构造来取代默认的拷贝构造

    a、拷贝构造只能有一个,不能重载

    b、一旦程序员自定义的拷贝构造,编译器就不再生成

    c、在自定义的拷贝中能通过编码来实现成员的复制

  • 4.一般情况下编译器生成的拷贝构造完全够用,不要轻易自定义构造
  • 5.什么情况下调用拷贝构造

    a、对象与对象赋值

    b、用对象与函数传参

    c、用对象当作返回值

二、初始化列表

  • 1、是一种成员的初始化方式,在构造函数的大括号前使用小括号对成员进行初始化的一种方式
  class
  {
   类名(参数列表):成员1(参数),成员2(参数)....
   {

   }
  }

a、参数列表可以解决构造函数的参数与成员重名的问题

b、参数列表会先与构造函数执行

  • 2、如果类成员是数组,可以使用{}进行初始化
  • 3、如果有成员是类,可以在初始化列表中显示调用构造函数
  • 4、如果成员中有const成员、引用成员,必须使用初始化列表
  • 5、类成员的构造顺序与初始化列表无关,而是与成员定义的顺序有关

三、this指针

  • 1、相同类型的对象各自拥有独立的成员实例,彼此共享一份成员函数,成员函数是如何知道谁在调用它
  • 2、为了让成员函数知道是哪个对象在调用,并准确访问到对象的成员,编译器会自动为每个成员函数添加一个看不到的参数,这个参数就是指向调用对象的指针(this)
  • 3、类中的所有成员函数都有this指针,包括构造、析构、拷贝构造等,只是构造中this指向的是正在被创建的对象
  • 4、this指针默认情况下都是隐藏的(在成员函数中访问成员变量时自动就加上了),但也可以显示使用
  • 5、使用情况使用this

    a、区分成员变量与参数

    b、把对象当作返回值与其他对象进行交互

四、常对象与常函数

  • 1、创建对象时添加const关键字,这个对象就不可再修改,就有了常属性,故意味着整个对象中的所有东西都不能修改
  • 2、常对象不能调用普通成员函数,调用成员函数就相当于把对象的this指针给了它,就会有被修改的风险
  • 3、函数体前加const关键的叫常函数,常对象只能调用常函数,普通对象也可以调用常函数

    常函数就相当于对this指针添加了const属性

  • 4、常函数与’非‘常函数会形成重载不会冲突
  • 5、如果有成员确实需要修改,它又被const修饰,可以对成员添加一个关键字mutable,这样即使常对象调用了常函数依然可以修改

五、析构函数

  • 1、当对象被销毁时自动调用的函数叫析构函数,对象的整个生命周期中只能被调用一次,它是对象被销毁前的最后一个执行的动作
  class 类名
  {
   //不能重载,只能有一个
   //不可以有返回值,没有参数
   ~类名(void)
   {

   }
  };
  • 2、编译会默认产生一个析构函数,默认析构函数负责销毁能看的到的成员,如果有成员是类,会自动调用成员的析构函数,类成员的析构过程和构造过程相反
  • 3、析构函数虽然不能重载,但可以自定义,有自定义析构函数默认析构就不会生成
  • 4、当类中有析构函数看不到的资源时, 有需要还原的设置时(把打开的文件关闭/把获取的数据保存),这时就需要自定义析构函数

六、赋值构造

  • 1、赋值构造就是一个对象给另一个对象赋值的时候调用的函数
  Student stu2 = stu1; //拷贝构造

  void func(Studnet stu); //拷贝构造
  func(stu1;)

  Student func(void) //拷贝构造
  {
   return *this;
  }
  Student stu = func();
  • 2、赋值构造函数的格式
  void operator = (Student& that)
  {

  }
  //可以与其他对象进行交互
  Student operator = (Student& that)
  {

  }
  • 3、编译器会默认生成赋值构造,它的功能与拷贝构造的功能一样,把对象A完全拷贝给对象B
  • 4、赋值构造与拷贝构造的区别

    拷贝构造:使用对象A去创建对象B(调用时对象B还未生成)

    赋值构造:对象A与对象B都已经构造完成,此时B = A;

    如果对象中有常成员,拷贝构造可以成功调用,但赋值构造不行

  • 5、一般情况下默认的赋值构造基本够用,除非有成员是指针,指向了额外的内存空间,这种情况下才需要自定义拷贝构造、赋值构造
  • 6、自定义赋值构造

    a、确定赋值构造的格式

    b、防止自赋值

    int num = 1;

    num = num;

    c、释放旧资源

    d、分配新的资源

    e、拷贝新内容

    //f、代码利用(显示调用拷贝构造)

七、静态成员与静态成员函数

  • 1、类成员被static修饰后,就会存储在bss段(此段是有编译存放的而且大小固定),在程序中动态的创建对象时它的静态成员就无法创建,所有的类对象共享一个静态成员
  • 2、静态成员只能在类中声明不能在类中定义(必须在类外定义)

    类型 类名::成员名;

  • 3、静态成员就是声明在类中的全局变量,在任何位置都可以使用 类名::静态变量名
  • 4、静态成员函数,类中的成员函数被static修饰后就变成了静态成员函数,所有对象共享一份静态成员函数
  • 5、静态成员函数不会传递this指针,也就不能访问成员变量

    不通过对象也能调用静态成员函数

    类名::静态成员函数(参数)

八、单例模式

  • 1、只能创建出一个对象的类,这种类叫做单例类,这种模式就叫做单例模式
  • 2、为什么需要单例模式,是为了提高安全性和稳定性的技巧。

    只允许存在唯一对象实例

    单例模式的商业应用:

    网站计数器

    日志管理系统

    连接池、线程池、内存池

  • 3、获取对象实例的专门方法

    a、全局变量的定义不受控制,能防君子不能防小人

    b、专门方法是类的一部分,"我是类型我做主",

    借助类禁止在外部创建对象,仅在类内部提供获取对象的接口。

  • 4、如何实现单例模式

    a、禁止在类外部创建实例,私有所有的构造函数 private

    b、类自己维护其唯一实例,

    静态成员变量 static 类名 instance;

    静态成员指针 static 类名* instance;

    c、提供访问该实例的方法,静态成员函数getInstance()

  • 5、饿汉单例模式

    不管是否需要对象都已经创建好了。

    优点:效率高、速度快、稳定。

    缺点:浪费资源,不管需不需要对象都已经创建好;

  • 6、懒汉单例模式

    当首次使用获取对象时才会真正创建出对象。

    优点:节约资源

    缺点:效率低,速度慢,不安全(多线程情况下)。

九、操作符函数

在C++中,编译器有能力把一个由数据、对象和操作符共同组成的表达式,解释为对一个全局或成员函数的调用。 该全局或成员函数被称为操作符函数,通过重定义操作符函数,可以实现针对自定义类型的运算法则,并使之与内置类型一样参与各种表达式。

十、双目操作符表达式

  • 成员函数

    形如L#R双目操作符表达式,将被编译器解释为 L.operator#(R)

    a-b+c == a.operator-(b).operator+(c)

  • 全局函数

    形如L#R的双目操作符表达式,将被编译器解释为 ::operator#(L,R)

    a-(b+c) == ::operator-(a,::operator+(b,c))

十一、单目操作符表达式

  • 成员函数

    形如#O或O#的单目操作表达式,将被编译器解释为 O.operator#(),唯一的操作数是调用对象。

  • 全局函数

    形如#O或O#的单目操作表达式,将被编译器解释为 ::operator#(O),唯一的操作数是调用对象。

十二、典型的双目运算符重载

 成员函数
 Point operator /+-*%|^& (Point& that)
 {
  Point t; // 会调用无参构造
  t.x = x / that.x;
  t.y = y / that.y;
  return t; // 不能返回局部对象的引用,否则会出现悬空引用
 }
 注意:原对象的值不变,要产生一个临时的对象

 bool operator > < >= <= == != || && (Point& that)
 {

 }

 Point& operator += -= *= /= (Point& that)
 {

  return *this;
 }

 注意:运算符的重载要符合情理。

全局函数

可能会访问到参数的私有成员:

1、把成员变成公开,但会破坏类的封闭性。

2、把全局函数声明为友元(友元不是成员),

3、不能在友元函数中直接访问成员变量。

 Point operator + (Point& a,Point& b)
 {
  Point t(a.x+b.x,a.y+b.y);
  return t;
 }

十三、典型的单目运算符重载

 成员函数:
 前++/--
 Point& operator ++/-- (void)
 {

 }

 后++/--
 Point operator ++/-- (int)
 {

 }

 全局函数:
 前++/--
 Point& operator ++/-- (Point&)
 {

 }

 后++/--
 Point operator ++/-- (Point&,int)
 {

 }

十四、输入、输出运算符重载

 输入、输出运算符不能重载为成员函数,只能是友元。
 ostream& operator << (ostream& os,Point& p)
 {

 }

 istream& operator >> (istream& is,Point& p)
 {

 }

十五、特殊的运算符的重载

[] 下标运算符,可以把对象当作数组来使用。

() 函数运算符,可以把对象当作函数来使用。

-> 成员访问运算符,可以把对象当作指针来使用。

  • 解引用运算符,可以把对象当作指针来使用。

    new/delete 也可以进行重载,但不建议使用。

    new会自动调用重载的new函数再构造函数。

    delete会先调用析构再调用重载的delete函数。

    只有极个别的运算符的重载对于对象来说是有意义(>>,<<)

    常考的运算符重载:前++/--,后++/--

十六、运算符重载的一些限制

  • 1、不能重载的运算符

    :: 作用域限定符

    . 成员访问运算

    .* 成员指针解引用

    ?: 三目运算符

    sizeof 字节长度运算符

    typeid 类型信息操作符

  • 2、运算符的重载改变不了运算符的优先级
  • 3、无法改变运算符的操作个数
  • 4、无法发明新的运算符
  • 5、重载运算符要注意运算符的一致性

    不要改变运算符默认的运算规则

  • 6、运算符的重载是为了方便使用、增强可读,不应该成功卖弄的工具。

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/qsz805611492/p/9489547.html

时间: 2024-10-09 10:48:37

C++知识点小结 (二)的相关文章

Hibernate知识点小结(二)

一.持久化对象和标识符    1.持久化类        配置完关系后,操作的实体对应的类,成为持久化类 (Customer) 2.持久化类标识符(oid:object id)        3.持久化类主键的生成策略        <id name="cust_id">            <generator class="native"></generator>                </id>    

Spring知识点小结(二)

一.配置非自定义的Bean(数据源DataSource模型) DBCP数据源:        导入dbcp的jar包:dbcp+pool+connector                代码实现:            //创建数据源对象            BasicDataSource dataSource = new BasicDataSource();            //设置数据库的基本参数            dataSource.setDriverClassName("

oracle事务知识点小结

DML语句流程 1 获取事务锁和ITL2 锁定候选行3 生成redo4 生成undo5 生成redo record写入log buffer并更改数据块 事务提交1 分配SCN2 更新事务表,将事务槽状态改为0x093 回收undo块4 创建commit redo record5 将redo从log buffer刷新6 释放表锁和行锁 锁一个事务由1个TX和若干TM组成,而回滚savepoint不会释放TX锁: ITL通过XID指向事务槽,进而指向undo记录,其UBA也指向undo记录:两者区别

javascript 学习小结 (二) by FungLeo

javascript 学习小结 (二) by FungLeo 前言 前面写过一个学习小结javascript 学习小结 JS装逼技巧(一) by FungLeo 那篇博文总结的东西还是比较多的. 但是JS有很多的内容,都是很有用的知识点,不可能一下子记住.因此,我的学习小结的会一直更新. 因为学习进度的不同,可能每篇博文的长短也不一样,有的学的东西多,就长点. 查询某个字符串在某个数组中的索引值 笨方法 我的基础比较差,所以很多东西是记不住的.因此,我在需要这样做的时候,我写了如下代码 var

SpringBoot 系列教程之事务隔离级别知识点小结

SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上,并通过实例演示不同的事务隔离级别下,脏读.不可重复读.幻读的具体场景 I. 基础知识 在进入正文之前,先介绍一下事务隔离级别的一些基础知识点,详细内容,推荐参考博文 mysql 之锁与事务 1. 基本概念 以下基本概念源于个人理解之后,通过简单的 case 进行描述,如有问题,欢迎拍砖 更新丢失

琐碎的知识点(二)

1.绑定设置时间格式 <%#Eval("time", "{0:yyyy-MM-dd}")%> <%#DateTime.Parse(Eval("time").ToString()).ToString("yyyy-MM-dd")%> 2.Repeater1.Items.Count 是指Repeter1的数据绑定条数 <%#this.rptnewstraining.Items.Count == 0 ?

PHP自定义框架部分知识点小结(一)

PHP自定义框架部分知识点小结(一) 网络上有大量优秀的MVC框架可供使用,但自定义框架并不是为了开发一个全面的.终极的MVC框架解决方案,而是将它看作是一个很好的从内部学习PHP的机会,在此过程中,将会学习面向对象编程和MVC设计模式,并学习到开发中的一些注意事项. Web MVC的流程体现如下图: 一个典型的Web MVC流程: Controller截获用户发出的请求: Controller调用对应的Model: Model调用DAO(基于PDO操作数据库的封装类)完成状态的读写操作: Co

.NET知识点总结二(笔记整合)

19.什么是类型? 用来定义某一种数据在内存里开辟空间的大小,还可以预置操作此种类型数据的相关方法 20.this关键字在方法中使用时所代表的含义 this指的是当前类的对象,或者父类的类的对象(base只能指向父类的对象) 21.里氏替换原则 子类替换父类所在的位置 22.C#中的数据类型 值类型 简单类型(数字类型(int,short,long,float,double),字符(char),逻辑值(bool)),结构体(struct),枚举(enum) 引用类型 字符串(string),数组

(萌O(∩_∩)O)哈希知识点小结

噶呜~先来了解一下什么是哈希吧? 当我们要在一堆东西中找到想要的那一个东西,我们常常通过比较来找,理想的情况是不经过任何比较,一次就能找到,怎么才能做到这样呢?那就在记录的储存位置和他的关键字之间建立一个确定的对应关系,我们称这种对应关系为哈希函数~小盆友们应该对哈希有了一个初步的印象了吧?其实,哈希函数就是一个映像,设定很灵活,只要使任何关键字由这个哈希函数所得的哈希函数值都落在一定范围内即可.当然,不同的关键字可能得到同一哈希地址,这就出现了所谓的冲突,至于怎么解决这种冲突,稍后就会了解到.