C++ Primer学习记录

本文介绍了C++编程中的关键概念和技术,包括预处理器宏的使用、信息隐藏与内联函数、构造函数与初始化、名称空间的管理和使用、数据类型与字符串处理、指针与引用的区别及应用。

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

 

               1、 开始      

※ 问题的解决                     
  分而治之,逐步求精                   
※预定义名字                     
 编译 C++程序时 编译器自动定义了一个预处理器名字__cplusplus                    
 在编译标准 C时 编译器将自动定义名字__STDC__                    
 __LINE__记录文件已经被 编译的行数 __FILE__包含正在被编译的文件的名字                    
 编译时间 __TIME__ 和日期 __DATE__                    

 ※assert()是C语台标准库中提供的一个通用预处理器宏                    #include <cassert>
    assert(__cplusplus); //assert断言                 
  由于所有的 C++库名字是在名字空间std 中被定义的,所以要包含using namespace std;                   
      #include <assert.h> 则不需要包含std即可               

               2、   C++浏览      

※ 信息隐藏              
 函数调用比直接访问内存的开销要大得多,但是由于“内联函数”信息隐藏并未对程序的执行效率             
  增加了严重的额外负担,成员函数会被自动的当做内联函数来处理            

 /**             
 * 构造函数             
 */             
 Array::Array(int sizeTemp)             
 {             
  init(sizeTemp, 0);            
 }             

 Array::Array(int *arrayTemp, int array_size)             //构造函数
 {             
  init(array_size, arrayTemp);            
 }              

 Array::Array(const Array& arrTemp)             //复制构造函数 
 {              
  init(arrTemp.size, arrTemp.arr);             
 }              
 /**              
 * 初始化函数(共通)              
 */              
 void Array::init(int sizeTemp, int* arrTemp)              函数重复度较高时,提取公共函数
 {              
  size = sizeTemp;             
  arr = new int[size];             

  for (int i=0; i<size; i++)             
  {             
   if (arrTemp)                
   {                
    arr[i] = arrTemp[i];               
   } else                 
   {                
    arr[i] = 0;               
   }}}                


※ 名称空间namespace                   
名字空间别名 namespace alias 允许用一个可替代的,短的或更一般的名字与一个现有的名字空间关联起来                   
   namespace LIB = IBM_Canada_Laboratory;                 
 using指示符使名字空间内的所有声明都可见                  using namespace IBM_Canada_Laboratory;
 using 声明 using declaration 提供了选择更为精细的名字可视性机制                  
    using IBM_Canada_Laboratory::Matrix;                
  ※ 为了使用名字空间中声明的名字 建议使用带有精细选择功能的 using声明代替 using指示符                  

              3、   C++数据类型    

※在一行的最后加上一个反斜杠 表明 字符串文字在下一行继续                  
   “abc \           "abc" "def"    
     def”             
※ 宽字符 wchar_t                  
 宽字符常量用来支持某些语言的字符集合 如汉语日语等中的某些字符不能用单个字符来表示                   
  L'a'                 L"a wide string"
  "two" "some"                 
  "two" L"some"  //不建议这样使用,没有为这两种不同类型的连接定义标准行为                
※对于每一个变量 都有两个值与其相关联:                  
 1.它的数据值 存储在某个内存地址中                 
 2.它的地址值——即 存储数据值的那块内存的地址                 
※ 初始化                  
 全局变量和静态变量会被自动初始化,局部变量则不会                 
 类机制通过缺省构造函数来初始化     
      string project;  //类机制初始化
 赋值初始化:   int ival = 1024;      
 隐式初始化:   int ival( 1024 );      
 另外 每种内置数据类型都支持一种特殊的构造函数语法 可将对象初始化为0     
         int ival = int();  // 设置 ival 为 0
※指针      
 指针不能被初始化或赋值为其他类型对象的地址值     
 int ival = 0;               double *pi2 = &ival;  //错误,类型不对     
 int *ptr = &ival;    double *pi = ptr;  //错误,2种指针对那块内存的存储布局和内容的解释完全不同       

 void* 类型指针 它可以被任何数据指针类型的地址值赋值 函数指针不能赋值给它       
   void *pv = pi;    
 void*表明相关的值是个地址 但该地址的对象类型不知道 我们不能够操作空类型指针     
 所指向的对象 只能传送该地址值或将它与其他地址值作比较     

※字符串类型                
 对隐式地将 string 对象转换成 C 风格的字符串 string 类型没有提供支持              
  char *str = s1; // 编译时刻类型错误              
  char *str = s1.c_str(); // 几乎是正确的 但是还差一点              
         为了防止字符数组被 程序直接处理 c_str()返回了一个指向常量数组的指针      
  const char *str = s1.c_str(); // 正确             

※引用                
 ※ const引用和非const引用              
 const引用可以用不同类型的对象初始化 ---只要能从一种类型转换到另一种类型即可,              
               也可以是不可寻址的值 如文字常量
 // 仅对于 const 引用才是合法的              
 const int &ir = 1024;               
引用在内部存放的是一个对象的地址,它是该对象的别名,对于不可寻址的值 如文字常量以及不同               
类型的对象,编译器为了实现引用必须生成一个临时对象,引用实际上指向该对象但用户不能访问它 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值