C++学习(一)

1.C++与C区别

<1>.c++是在C的基础上扩充了很多的内容,更加强大;

<2>c++是完全兼容C,只要合法的C程序在C++中也是合法的;

<3>.C面向过程的结构化程序设计语言;结构体:--》面向对象的编程,实现过程比较复杂!

.C++面向对象的编程语言:更多采用面向对象编程,更符合我们自然界的发展规律!

C++面向对象更注重结果:对象+对象(数据属性+对数据的操作)

C更注重过程:数据属性+对数据的操作。

2.命名空间

什么是命名空间?格式是什么样子?

定义: namespace 命名空间的名字

{

    变量; 函数;

};

访问: 命名空间名字::变量/函数名();

       或者使用 using namespace 名字;

  1. 引用类型

目的:弱化指针,因为引用可以实现和指针一样的效果;使用方便!

      减少临时空间的分配;定义指针需要分配内存空间,而定义一个引用是不需要的!

什么是引用:其实就是给已经有的变量起个别名!它和变量指的是同一块内存空间!

定义格式:

       Int a=10; int &b = a;

    

面试题目:引用和指针的区别?

  1. 引用一定要进行初始化;指针可以不初始化;
  2. 引用只能初始化一次;指针是可以改变指向;使用引用比指针安全
  3. 指针需要开空间,引用不需要

函数重载

什么是函数重载:函数名相同,功能相似、函数的参数不同、与返回值无关(个数、类型、顺序)的一组函数互为重载!

函数调用的原理:函数名其实就是函数在内存中的地址

函数重载的原理:

     G++编译之后,会对函数名进行重名名,不同的函数名对应的函数在内存中的地址就是不一样的,调用的时候自然就执行不同的函数!

面向对象编程中类和对象

C++中的结构体与C中结构体的区别:

     <1>.C结构体中不能有函数,而C++结构体中可以有函数;

  <2>.C中空结构体占的内存大小是0;c++中空结构体占的内存大小是1!

 把属性和行为整合在一起来描述一类事物的自定义的数据类型,在c++中把这种数据类型称为

C++中的结构体和C++中类的区别?

  1. 定义变量时初始化的方式不一样
  2. 结构体变量通过.可以直接访问数据成员;得出结构体中成员都是public权限

类类型的变量通过.方式获取数据成员:提示是private,没法访问;得到类中成员默认是private权限

  1. C++的类有访问成员的限定符:public、private、protected

public: 共有的,在类的内部、类的外部都可以访问

private和protected:在类的外部是不可以访问的;只能在类的内部可以访问

什么是类内:{} 范围之内的,都是类内

什么是类外:{} 范围之外的,都是类外

类这个类型定义出来的变量,不叫变量,叫做对象!

对象:使用这个自定义的类数据类型定义出来的变量;

类和对象是什么样子的关系:

     电脑===== 我的电脑

总结:类是对象的抽象;对象是类的具体实例!

  1. 封装

面向对象编程的特性: 抽象、封装、继承、多态

抽象:就是根据多个对象观察他们共同的属性和行为,提取出来

封装:把提取出来的共性给整合在一起,得到一个整体;并且要对外提供一些接口供我们外部调用!

空调   ===》教室的空调

总结封装:把属性和行为整合起来,外壳用类这个自定义的数据类型封装起来,该隐藏的隐藏起来,该暴露的暴露出来!

哪些是该隐藏的?   一般属性都是隐藏起来的   private、protected

哪些是该暴露的?   行为都是暴露出来         public

定义一个数据类型,是不占内存空间的,但是它本身是有大小的;sizeof

只有在定义变量的时候,才会分配内存空间!!!

类和对象在内存中的关系所有的这个类的对象共用一份成员函数;这个类的所有的对象都拥有一份自己的数据成员。创建对象的时候,其实是给数据成员分配内存空间的!

类的所有的成员函数都有一个隐藏的参数,是这个类类型的指针,用来保存调用这个成员函数对象的地址!

总结:

不管在类内部还是类的外部,访问成员都需要有对象!

如果是普通的对象,访问:对象名.成员;

如果是指针类型的对象,访问:指针对象->成员!

哪个对象调用 成员函数,this指的就是哪个对象的地址!

  1. 构造函数

本身:是函数

作用:对数据成员进行初始化;

什么时候谁来调用这个构造函数:创建这个对象的时候就已经调用了,系统帮你去调用的!当我们自己没有定义构造函数的时候,系统会有一个默认的构造函数(无参数函数体为空)!

类的所有的成员函数都有一个隐藏的参数,就是这个this;  类名 * const this;

构造函数格式:函数名和类名是一样的,没有函数类型,参数不定==(构造会有重载)

默认构造函数:系统提供的

              自己定义的,无参数

              自己定义的,所有的参数都有默认值。

              但是在一个类中,默认构造只能有一个!!!

  1. 析构函数

本质:函数

作用:做清理工作,回收对象所占的内存空间,如果我们在构造函数中有在堆区分配过内存空间,在析构中要记得去做释放!

什么时候谁来调用:  在对象生命周期结束的时候,系统自动来调用!析构函数如果我们自己不定义,系统提供!析构函数定义格式无函数类型 无参 函数名:~类名(){}

拷贝构造:深拷贝和浅拷贝

什么时候执行拷贝构造:用已经存在的对象去初始化一个正在新创建的对象的时候,会去执行拷贝构造!我们自己没有定义,系统提供;如果我们自己定义了,系统不提供!

拷贝构造的格式:

     函数名和类名一样,有参数并且这个参数是当前这个类类型的引用。

什么时候需要进行深拷贝?什么时候需要浅拷贝呢?

   如果有在构造函数中使用new分配空间的,如有进行对象的拷贝,就需要进行深拷贝!

系统给我们提供的拷贝构造是浅拷贝构造;需要进行深拷贝,拷贝构造函数一定要自己去写!

  1. static修饰类的成员

static作用:

static修饰全局变量:限制了全局变量的作用域

static修饰局部变量:延长了局部变量的生命周期

static修饰函数:和修饰全局变量是一样的效果!

  特点:存储在静态区

    1. static修饰类的数据成员

static修饰数据成员:类内声明,类外定义

结论:类的静态的数据成员属于类,但是不属于具体的某一个对象,但是所有的对象都可以访问。

      类的静态的数据成员在编译的时候就已经给分配了内存空间!在创建对象的时候,不会再给静态的数据成员分配内存空间了!

类的静态数据成员访问

<1>.通过对象名.变量名;    

<2>.通过类::变量名;         放在public区域即可!

作用:实现数据的共享!!!

应用:例如实现ID自增等!

    1. static修饰类的成员函数

和类的静态数成员访问方式是一样的;也是可以通过对象和类名的方式去访问;

作用:实现方法的共享!

结论:静态的成员函数中只能访问类的静态成员
      非静态的成员函数是可以访问类的静

  1. const修饰类的成员

const 只读

const int a = 10;

const int *p = &a; *p的值不能修改

int *const p=&a;    p的值不能修改

 2-1、const修饰类的数据成员

Const修饰数据成员:这个成员变量就不可修改!

3、mutable修饰符

mutable修饰符出现解决的问题: 当我们使用const修饰了类的成员函数,想去修改类的数据成员,就可以用mutable去修饰类的数据成员,可以实现成员值的修改!

  1. 友元

友元就是相当于朋友一样!

关键字:friend

解决的问题

     因为我们类的私有的数据成员在类的外部不能直接访问,需要在public区提供对应的接口函数;如果是偶尔要获取到类的数据成员的值,调用函数可行;如果是频繁的获取到对应的数据成员,就要频繁的调用函数;那调用函数需要进行出入栈,是需要开销的,这样子效率也比较低!

     能否直接去访问呢?

  1. 类外的函数做友元
  2. 外部的类做友元
  3. 外部类的成员函数做友元
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值