c++笔记1

本文深入探讨了C++中的引用、const引用、内联函数、重载等关键概念,并介绍了C与C++的相互调用方式、动态内存分配、命名空间及不同类型转换的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.引用:可以认为是一个已定义的变量的别名
 Type& name = var
   eg:int a = 4;
      int& b = a;
必须在声明的时候用变量初始化  int& b;b=a;×
在一些场合可以代替指针,比指针具有更好的可读性和实用性
eg:
void swap(int& a,int& b)
{
   int t = a;
   a = b;
   b = t;
}
swap(a,b);
void swap(int* a,int* b)
{
   int t = *a;
   *a = *b;
   *b = t;
}
swap(&a,&b);

2.const引用:让变量只读(不能作左值)
const Type& name = var;
eg:
int a = 4;
const int& b = a;
b=5;×
使用常量const 引用初始化后将生成一个只读变量
引用在c++内部是常量指针,所占用空间大小与指针相同
引用作为返回值时:
①作为局部变量的返回值,不能作左值
②作为全局/静态变量的返回值,能作左值能作右值

3.内联函数:可用于替代宏代码块
inline int fun(int a,int b)
{
  ......
  return ;
}
最终生成的代码是没有定义的
编译器直接将函数体插入调用的地方
无调用开销
只是对编译器的请求,请求不成功将作为普通函数
限制:不能有循环
      不能有过多的条件判断语句
      函数体不能过大
      不能对函数进行取址
      内联声明必须在调用前

4.重载:同一关键字搭配不同的上下文含义不同
  函数重载:同一函数名定义不同函数
  int fun(int x){......}
  int fun(int a,int b){......}
  int fun(const char* s){......}
  重载必须至少满足以下一点:参数个数不同/参数类型不同/参数顺序不同
  返回值不能作为重载依据
 
5.c与c++相互调用
  #ifdef _cplusplus
  extern "c"
  {
  #endif
  ......
  #ifdef _cpluscplus
  }
  #endif

6.动态内存分配:new   删除 : delete
  变量申请:Type* pointer = new Type;......delete pointer;
  数组申请: Type* pointer = new Type[N];......delete[] pointer;
eg:
  int* p = new int;
  *p = 5;
  *p = *p+10;//*p=15;
  delete p;
  p = new int[10];
  for(int i=0;i<10;i++)
 {
    p[i]=i;
 }
  delete[] p;
new 关键字初始化:int* p = new int(1);char* p = new char('c');

7.命名空间
  namespace name{......}
  eg:namespace first
  {int i=0;}
  namespace second
  {
     int i = 1;
     namespace internal
     {
        struct P
        {
            int i;
            int y;
         }
      }
   }
命名空间的使用:
①使用整个命名空间:using namespace name;
②使用命名空间中的变量:using namespace::variable;
③使用默认命名空间中的变量: ::variable;
eg:using namespace first;
   printf("i = %d";i);//i=0
   using second::internal::P;
   printf("second::i = %d",second::i);//i=1
   P p = {2,3};//p.x = 2;p.y = 3;

8.强制类型转换
  ①static_cast:基本类型间的转换,不能用于指针
                有继承类对象间的转换和类指针间的转换
   eg:
   int i = 0;
   char c = 'c';
   int* p = &i;
   char* pc = &c;
   c = static_cast<char>(i);√
   pc = static_cast<char*>(pi);×
   ②const_cast:用于去除变量的const属性
   eg:
   const int& j = 1;
   int& k = const_cast<int&>(j);
   const int x = 2;
   int& y = const_cast<int&>(x);
   k = 5;y = 3;
   //j = 5;k = 5; x = 2; y = 3;
   ③reinterpret_cast:用于指针类型间的强制转换
                      用于整数和指针间强制转换
    eg:
    int i = 0;
    char c = 'c';
    int* pi = &i;
    int* pc = &c;
    pc = reinterpret_cast<char*>(pi);
    pi = reinterpret_cast<int*>(pc);//可以这样转换,但是没意义
    ④dynamic_cast:用于类层次的转换,类之间的转换

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值