C++总结(二) const、 new 、引用

目录

一、函数重载    

重载的三要素

二、New  maloc

New和malloc的区别:

Delete 、delete[] ?

三、Const

c、c++中const的区别

常函数   void fun() const {}

常对象

四、引用

五、内联 inline

Inline函数和static修饰的函数的区别

Inline函数和宏的区别

Inline缺点

六、函数的默认值

七、C、C++的相互调用

八、Namespace

C++基础及进阶

C++ struct和class区别


一、函数重载    

YA :cd_call   H:int   N:doubleI

调用点看不见返回类型 会产生二义性

函数符号生成规则

int Sum(int a,int b)   _Sum    ?Sum@@YAHHH@Z

{ Return a+b; }

double Sum(double a,double b)   _Sum    ?Sum@@YANNN@Z

{ Return a+b; }

double Sum(int a,int b)       ?Sum@@YANHH@Z

{ Return a+b; }

C  函数名

C++  函数原型

  1. 返回值   x
  2. 函数名 v
  3. 参数形参 v
    1. 参数个数
    2. 参数类型
    3. 参数顺序

重载的三要素

  1. 同名
  2. 不同参
  3. 同作用域
  4. Bool Compare(int a,int b)
    
    {  Return a>b;  }
    
    Bool Compare(double a,double b)
    
    {  Return a>b;  }
    
    Bool Compare(char* pa,char* pb)
    
    {   Return strcmp(pa>pb)>0?true:false;   }
    
    Int main()
    
    {
    
      Bool Compare(int,int);
    
      Bool Compare(10,20);
    
      Compare(10,20.1);
    
      Comppare(hello,world):
    }

    下面的三个  会直接调用main()中的Compare(int,int)  即使产生错误  重载必须同作用域

内置类型都有强制转换  int可以转double double不可转Int

二、New  maloc

Int *p=malloc(1)

Malloc 返回为void* 需要强制转换

Malloc 开辟一个字节 而指针指向4个字节 指针指向三个越界字节

New和malloc的区别:

  1. new 关键字  malloc函数
  2. new 自由存储区  malloc 堆上开辟
  3. new      malloc
    1. Operator new  开辟内存
    2. Construct 初始化
      1. Malloc 只开辟内存
  4. new可以进行函数重载   malloc 不可以 (mallloc是c中的)
  5. New可以调用malloc  mallloc不可调用new
  6. 内存开辟 new 抛异常 malloc 返回null
  7. new可以开辟常量 malloc 不行   new int(20)

Int* p=new int[10];

Delete p; 数组开辟 单个内存释放  V

Delete 、delete[] ?

多一个int 保存 对象的格式即调用析构的次数

(1) 为基本数据类型分配和回收空间;

(2) 为自定义类型分配和回收空间。

基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;

但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。

所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。

 参考:https://www.cnblogs.com/tp-16b/p/8684298.html

class T {
public:
  T() { cout << "constructor" << endl; }
  ~T() { cout << "destructor" << endl; }
};
int main()
{
  const int NUM = 3;
 
  T* p1 = new T[NUM];                    
  cout << hex << p1 << endl;                            //输出P1的地址
  //  delete[] p1;
  delete p1;

  return 0;
}

    

delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。

参考:https://www.cnblogs.com/chucks123/p/7764449.html

 

三、Const

c、c++中const的区别

C   常变量

编译阶段 常变量有没有做左值 其他的处理和变量一样(指针指向 引用修改)

C++ 常量

编译阶段 把常量使用的地方 替换常量初始化的值

  1. 一定要初始化
  2. 不允许左值
  3. 不允许间接访问来修改常量内存 杜绝间接访问的风险

C

Const 修饰的全局变量  local->global

C++ Const 修饰的全局变量  local extern

Int main()

{

    Const int a;

    Int *p=&a;

    *p=20;

    Prinf(“%d\n”,a);

    Return 0;   C  V
}

Int main()

{

    Const int a=10;

    Int* p=(int*)&a;

    *p=20;

    Std::cout<<a<<std::endl;

}

参考:https://blog.csdn.net/fighting123678/article/details/79487479

常函数   void fun() const {}

  构造函数和析构函数不可以是常函数

      特点:①可以使用数据成员,不能进行修改,对函数的功能有更明确的限定;

                 ②常对象只能调用常函数,不能调用普通函数;

                ③常函数的this指针是const CStu*.

常函数不能修改数据成员

特点:

1)可以输出,可以运算,但不能进行修改

2)这种不可修改只针对于类的数据成员,对于函数自身的参数可以进行修改

3)常函数的this指针变成了const 类名*

好处:

对函数功能有更明确的限定,例如只能输出,但不能进行修改

常对象

1)常对象格式:const 类名 对象名

2)常对象只能调用常函数,不能调用普通函数

class Cperson
{
public:
	void show1()
	{
		cout << "I am ordinary" << endl;
	}
	void show() const
	{
		cout << "I am const" << endl;
	}
};
 
int main()
{
	const Cperson op;
	op.show();      //正确
	op.show1();     //错误
 
	system("pause");
	return 0;
}

四、引用

别名 (内存单元)

引用底层以指针做支持  不能引用常量 常量无地址 在寄存器中

  1. 一定要有初始化
  2. 不能 引用 不能取地址数据
  3. 引用不能改变
  4. 引用变量只能使用 引用变量所引用的数据

五、内联 inline

编译阶段  代码调用点直接代码展开(内联不生成符号) 本文件可见

Inline函数和static修饰的函数的区别

(static修饰  global->local)

  1. inline函数 无开栈清栈开销 static 有
  2. Inline 在调用点直接代码展开 static  函数符号属性 local

Inline函数和宏的区别

  1. lnline编译  类型检查 和 安全检查   宏 预编译 无
  2. Inline是一个更安全的宏

注意事项:

  1. 实现在头文件中
  2. 只在release版本生效
  3. 给编译器的一个建议 (递归 循环 switch  不可处理为内联)
  4. 基于实现,不是基于声明  iniine写在定义点

Inline缺点

以代码膨胀为代价 空间换时间

建议

  1. 开栈的开销>执行的开销   建议设为inline
  2. 开栈的开销<执行的开销   不建议设为inline

否则目标代码太过庞大 指令太复杂

六、函数的默认值

  1. 自右向左,依次赋予  (实参和形参的匹配 自左向右)
  2. 不能重复赋予
  3. 一般将默认值赋在声明上

七、C、C++的相互调用

Extern “C”  C++独有的

  1. C++调用C

C++源文件中加extern c

  1. c调用c++
    1. C++源文件可修改  c++源文件中加extern c
    2. C++源文件不可修改  加中间层 .cpp
  2. 不明确编译器
    1. #ifdef _cplusplus c++

八、Namespace

 Using namespace std; using 指示符  所有符号暴露

 Using std::cout; using声明  std::cout下的符号暴露

同名的空间作用域合并

void Reverse_Print(int arr[],int len)

{

    if(len==0)

    return ;

    std::cout<<arr[len-1]<<" ";

    Reverse_Print(arr,len-1);

}

C++基础及进阶

一.类和对象

c语言无空的结构体    0  C++ 1

C++:空结构体和空类所占内存大小为1,C:空类和空结构体占用的大小是0

C++ struct和class区别

1、默认的继承权限

struct默认是公有继承(public),class默认是私有继承(private

2、关于默认访问权限

class中默认的成员访问权限是private的,而struct中则是public的。

三大特征

封装 继承 多态   成员变量对类是独有的 成员方法对类是公享的

变量 内存

对象 内存+资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值