c++ 关于引用、面向对象、构造析构、拷贝、拷贝构造、声明与分离

1.引用(接上篇引用内容)

1)常量的引用

  const int& x=y;       x++;(错误)不可以修改const常量的值

一般用在函数中,用来防止修改的值    void(const int& x){  }

2)引用和指针的区别(面试题)

 ①指针可以修改指向,引用不可以修改指向

②指针保存的是地址,引用只是一个别名

③指针不一定要初始化,只是野指针,但引用必须初始化

④指针本身有内存空间,而引用没有

⑤有指针的引用,没有引用的指针

⑥指针的堆空间是需要释放的,而引用不需要释放

2.面向对象

1)基本概念:c++在c的基础上增加了面向对象的概念,支持面向对象的设计,类是c++的核心,类是泛指,具有属性和行为,具有成员变量和成员函数。对象是特指,类中的某一个个体,具有类的属性和行为。

 2)面向对象的特征

      封装   继承  多态

3)定义一个类

  关键字是class,格式 class  类名 {  成员变量 ; 成员函数};

4)访问修饰符

 public:     共有属性,在类内可以使用,类外可以使用,子类可以使用;

 private:    私有属性,只可以在类内使用,其他地方没法访问。   

 protected:  保护属性,在类内可以使用,可以在子类中使用,不可以在main中使用

 不写修饰:默认是私有属性

 

5)get和set方法

   当定义私有成员或者保护成员变量时,为了给外界提供修改变量的方法,时常会定义两个共有的成员函数,一个是get是获取私有成员变量的值,一个set是设置私有变量的值。

   使用: 正常函数的使用,和对象.成员函数(参数) 一样的使用方式

        

6)this指针

定义: this指针表示“我”,是代词。定义的对象是什么则this表示什么

使用:在普通成员函数中,编译器会自动添加当前类对象的this指针;

总结:每个对象都有this,指向对象本身,每个对象可以通过this访问到成员变量;

      静态成员函数中没有this指针,友元函数中没有this指针;

7)类和结构体区别(c++中)

A: 类和结构体的关子健不一样

B: 类中的成员方法和属性默认是私有的,而结构体中默认是共有属性

C: 在c++中类和结构体都可以定义对象,使用方法一样

D: 类和结构体中都可以有限定符修饰 public protected  private修饰

E: 结构体可以添加struct关键字,而class不需要;

F: 结构体主要是c语言中,而class主要用于c++中。

      注意事项:在c++  中 结构体可以省略struct关键字

3)构造析构

①构造函数:是函数,在构造对象的时候调用,用来创建一个对象。

②定义: 没有返回值(void都没有)且函数名和类名相同的函数

③作用: 一般是用于构建对象的时候给初始值使用。

④重载:构造函数可以重载,也是参数列表不同;

     缺省参数: 构造函数也可以设置缺省参数;但需要避免重载的二义性;

注意:如果没有手动写构造,编译器会自动创建构造函数,叫做缺省构造(无参)。

     主要手动添加了构造,则编译器会注释掉自动添加的构造函数。

     构造函数只可以是public属性(单例模式是特殊情况),公有属性;

构造函数也是成员函数,需要添加public属性

只要手动写构造,则一般会手动添加无参构造函数

⑤构建对象: 在构建对象的时候,如果构造函数没有参数,则直接类名 对象名的方式

             如果只有有参构造,在构建对象时候需要加上实参,例如: student danny(1,2);

       

⑥构造函数的初始化列表

定义:在构造函数的初始化列表部分可以给成员变量赋值;

格式: 类名(参数):成员变量1(参数1),成员变量2(参数2){   }

注意:构造函数的初始化列表先执行,再执行函数体中代码;

      初始化列表后只可以成员变量的初始化,不可以是参数等其他变量的初始化

      初始化列表中的初始化顺序和成员变量的定义顺序有关

      和初始化列表的顺序无关

4.析构函数

  定义:析构也是特殊的成员函数,用来释放对象。不可以主动调用。

  格式:  ~类名() { 函数体}

  注意:  析构函数的函数名是~+类名,  ~student(){  }

          析构函数没有返回值,不可以写void

          析构没有参数,不可以写参数,因为不可以主动调用。

          如果没有手动添加析构,c++会自动添加析构函数。释放对象时候会自动调用;

  作用: 用来释放内存,关闭文件,用来释放句柄,用来关闭线程。。。。。善后工作

5.拷贝构造

  定义:也是构造函数的一种,是根据其他对象来构建一个新对象。

  格式:类名(const 类名& 对象名) { 函数体}

  浅拷贝和深拷贝:

        浅拷贝: 只会拷贝指针,不会拷贝指针对应的内存空间(避免)

student(const student& other)  
    {
        p = other.p;
    } 

        深拷贝:会先申请内存空间,拷贝指针指向的内存空间值,对象指向不同内存;

    

student(const student& other)  {
        //防止自拷贝
        if(&other == this)
        {
            return;
        }
        //先释放内存再申请
        if( p != NULL)
        {
            delete p;
        }
        //申请内存拷贝值
        this->p = new int(*other.p);
    }

   

  深拷贝注意事项: 需要防止自拷贝,如果指针指向了某一个内存,需要先释放在申请

  注意:如果一个类中什么内容都没有,sizeof(类名)的大小是1字节

       如果没有写拷贝构造,编译器默认会添加一个浅拷贝构造 ;

6.声明和定义分离

   ①在头文件中定义类,在cpp中实现类中的成员函数

   ②方式: 返回值类型 类名::函数名(参数){  }

            需要加上类名限定符,表示当前函数是属于哪个类的;

 目的:为了模块化编程,一个h和一个cpp关联,h用来申明,cpp用来实现

        为了隐藏函数的实现,只提供.h给外界。

        防止头文件包含除了用#ifndef   还可以用#pragma once

猜你喜欢

转载自blog.csdn.net/m0_74889801/article/details/128595109