C++的简单知识(一)

一、宏定义:傻瓜式替换 无法定义复杂的函数
二、关键字
下面我们先来看一下语言中一些关键字的作用
关键字:register
提高程序运行效率:省去CPU从内存抓取数据的开销
语法作用:尽可能将变量保存在CPU内部寄存器中
使用注意事项
只能修饰局部变量,不能修饰函数、全局变量
使用register修饰的变量,不能通过&获取该变量的地址;(有可能该变量保存在cpu内部寄存器中)(C++)
register修饰变量类型一定是CPU所能处理的数据类型;(有的cpu不支持浮点型运算)
什么时候用register修饰一个变量? (频繁访问的变量)

关键字:volatile
防止编译器优化(将变量优化到寄存器中(寄存器存在边际效应))
使用场景:访问硬件时,所使用的全局变量;

关键字:typedef
语法作用:给数据类型重命名
1.可读性、移植性;

函数名命名规则:解决的是函数功能可读性,无法解决形参的可读性 

typedef存在一个问题:重命名函数指针时,可读性差;

关键字:const
将一个变量变为只读变量
修饰函数形参,保存实参在函数执行过程中不能被改变

看过了C语言这些关键字的作用我们来看一下在C++中这些关键字的作用

关键字:register 
优化内容:当对register变量取地址时,会将该变量重新保存到内存中;

关键字优化:tyepdef == using
优化内容:using类型重命名

关键字:const
优化内容:const修饰的变量是常量;

三、什么时候传地址,什么时候传值?
    当修改实参变量值时,传实参变量的地址; (传实参变量的地址,即可以使用也可以修改实参变量的值)
    当只使用不修改实参变量值时,传实参变量名; (传实参变量名,只能使用实参变量的值,不能修改)

C++引用:解决就是函数指针传参和返回值问题
引用就是给变量起别名,操作引用相当于在操作引用所绑定的变量
注意事项: 定义引用必须绑定变量; 一旦绑定一个变量就不能再绑定其他变量

引用是否占用额外内存空间? YES  编译器优化:不将这个空间展示给开发人员,不能操作这段空间  "新的数据类型"

C++11:左值引用  右值引用

     * 左值:可以被修改的值可以作为左值 (可以取地址的可以作为左值)
     * 右值:不可以被修改的值可以作为右值 (不可以取地址的可以作为右值)
     * 左值引用:只能绑定左值  int &
     * 右值引用:只能绑定右值   int &&  (对象移动)

四、命名空间:
以下情况:不用源文件可以有相同名字的命名空间; 
 * 使用命名空间加作用域限定符访问成员时,优先导入本文件的命名空间 
 * 使用using导入命名空间时,导入的是所有程序中的命名空间;(只要没有命名冲突都是被允许的)(直接导入
)

五、inline
C语言:处理阶段:预处理处理
       处理过程:傻瓜式替换  (没有空间分配过程)  不做语法检查!!!  不安全
inline:修饰的函数为内联函数、内嵌函数

空间(内存空间)、时间(编译时间、运行时间)
以时间换空间:消耗了更多编译/运行时间,换取占用更小的内存  (宏函数)
以空间换时间: 占用更多的内存空间,换取运行时间  (inline内嵌函数)


C++:inline:编译决定是否内联处理
     * 函数的默认参数:如果一个参数为默认参数,那么它右边的所有参数必须为默认参数
     * 函数的参数占位符: 预留函数接口
     * 函数重载: 函数名命名的可读性问题!!
     * 函数重载的条件: 函数形参的个数不同; 函数形参个数相同类型不同; 函数形参个数相同,形参类型不同顺序不同;
     * 函数形参的个数、类型、顺序不同!!!!
     * 注意事项:函数返回值不能作为重载条件; 函数默认参数会影响重载条件;

六、struct
struct升级1: 可以省略struct关键字定义变量
struct升级2: 可以在struct里定义函数
struct升级3: 可以对成员加入访问权限 
public(公用:可以在外部直接访问)  private protected
private(私有:只能在struct结构体内部访问使用,或者内部函数直接访问,不能在外部直接访问)
protected:(保护:只能在struct结构体内部访问使用,或者内部函数直接访问,不能在外部直接访问)
如何对private/protected成员设置值?提供set/get方法

strcut升级目的为了引入class类型 "类"

strcut VS class
叫法: struct 结构体  class 类  struct定义的变量是结构体变量;class定义的变量称之为对象;
叫法2: struct/class:变量称之为属性或者是成员变量;  函数成为方法;
默认访问权限: struct默认的是public class 默认的是private


七、类型转换
C++为什么提出新的类型转换运算符? C语言类型转换是个不安全转化(任意类型转化,不检查)

static_cast:相关类型;父类与子类;void *与其他类型指针之间的转换;
任意两个类型的指针之间转换不能用static_cast
char *temp = static_cast<char *>(pi);

reinterpret_cast:类似C语言的强制类型转换; 可以达到任意类型转换,但是它不检查错误;
char *temp = reinterpret_cast<char *>(pi);  //建议少用,不安全;

去const属性:  const  = !const ok!!    !const = const  no!!
const_cast:只能去除指针或者引用的const属性

八、constructor
 构造函数:
特点: 没有返回值; 函数名与类型相同; 可以重载; 当实例对象时,会自动调用;
特点:系统会默认生成一些构造函数;
规则:当用户为给类定义任何构造函数时,系统会默认生成一个无参的构造函数;如果定义了构造函数,系统不会生成默认的构造函数
 C++11:default  delete
 构造函数的分类:
 1\默认无参构造函数/自定义的有参构造函数;
 2\类型转换构造函数:构造函数只有一个参数;防止隐式类型转换:explicit  如何类型转换?重载类型转换运算符;
this指针:保存的是当前对象的地址; 对应的对象的方法形参都会多一个相应类型的this指针,传参时,将对象的地址传递给this;
初始化列表:  为什么需要初始化列表? 处理一些特殊的成员属性;  语义:定义并初始化
<引用:定义必须初始化;
const成员:定义必须初始化;
成员对象(无默认构造函数:无参的构造函数):实例对象时会自动调用构造函数(定义并初始化)>
注:初始化列表的效率要高于在构造函数内部初始化;建议大家优先使用初始化列表!
3\拷贝构造函数:
<作用及调用时机:用已有的对象初始化新的对象;
默认生成:当类里未定义拷贝构造函数,系统会默认生成拷贝构造函数
函数原型:Student(const Student& stu); 将stu里的成员值赋值给当前的对象
!**! 默认生成一个=运算符重载函数:拷贝赋值运算符重载
浅拷贝和深拷贝!!!!
4\移动拷贝构造函数
c++11提出对象移动语义!
对象移动:解决对象(临时对象)拷贝赋值开销的问题; 
<将原有对象的成员空间所有权传递给新的对象,不发生值的拷贝!
拷贝的操作的开销是比较大!>
提出右值引用的目的:实现对象移动(区分对象拷贝和对象移动的)
vs2017:将临时对象作为右值处理,所以返回临时对象做初始化或者赋值时,会调用移动拷贝构造函数或者g++:未将临时对象当做右值使用,所以不会调用移动拷贝构造函数或者移动=运算符重载函数;


析构函数:释放属性所占用的空间
 特点:函数名是~类名; 无形参; 不能重载; 无函数返回值; 当对象释放空间时,会调用自身的析构函数


九、member
类成员(静态成员):属于类,不属于某个具体的对象;
访问形式: 对象名.类成员名  类名::类成员名

C/C++中static关键字作用?
     * 修饰局部变量或者局部对象,延迟该变量或者对象的生命周期;
     * 修饰全部变量或者全局对象,只能在本文件访问不能在其他文件访问;
     * 修饰类的成员变量时,该变量为静态变量,属于类,被该类的所有实例化的对象共享访问;不占用对象的空间;
     * 修饰普通函数,该函数只能在本文件访问不能在其他文件访问;
     * 修饰成员函数时,该函数为静态成员函数,属于类,不属于对象,被该类的所有实例化的对象共享访问;没有this指针,不能访问类的非静态成员;


什么样的情况下需要用static修饰一个类的成员或者成员函数?
C/C++混合编程时,C的接口需要一个函数地址作为参数时,只能将类的非静态成员函数变为静态成员函数;

十、友元
友元: 友元函数/友元成员函数/友元类
友元?友元提供了(在不同类的成员函数之间,类的成员函数与一般函数之间进行的)共享数据的机制
	  通过友元函数 一个普通函数或者其他类的成员函数可以访问类中的private成员。
1.  友元函数
	和一个外部的 普通函数 交朋友!
	建立关系 :  friend int get_area(CBox &b)
2.  友元成员函数
	成员函数属于谁? 我(需要访问)
	朋友是谁?       你需要某个人的数据 他就是朋友
	friend声明在哪? 谁声明friend谁就要把自己的东西分享出去
					 分享东西出去的那个人那里声明friend
	注意
		由于A2的定义在A1之后 对A2进行引用性声明
		在friend声明由于是在A1的类外 所以需要 friend void A1::change(A2 &a1)

3.  友元类
	注:1.在A2中可以访问A1里的成员! 反之不行!
	2.友元类关系中  没有传递性!(A是B的友元 B又是C的友元 A和C也是友元?错误!!!!)
注:友元!破坏了封装性 因此谨慎使用友元关系
    如何正确使用? 用友元的时候 一般用来获取 不修改

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值