C++知识梳理

概述

C++语言是一种面向对象与面向过程混合式语言(混合型OO语言)。是C的超集。代码效率较java、python等要高。  

    支持 头文件程序结构、名字空间、异常处理、运算符重载、函数模板和类模板、多继承、指针。

 备注:关于C++向C的兼容可以从程序结构和头文件等方面进行理解。C++允许在类体外定义变量和函数;C++头文件分为3种:.h旧式头文件都来源于C

1.关于左值和右值

左值表达式:可以在等号左边出现的值表达式
– 非const类型的变量、:int x; x=2; 
– 引用非const类型的变量:int &y=x; y=3; 
– 非const指针和非const内容:char*p=&z; p="ab";
– 返回引用非const类型的函数:int &f ( ) { }; f ( )=3
– 前置++和--运算:int C=1; (++C) =5; //C++=5?
– 赋值运算: (C=2)=3; (C+=2)=3;  在C++里赋值表达式为左值,返回对象的引用
右值表达式:只能出现在等号右边的值表达式
– 字面常量
– 后置++,--
– const类型的变量或引用
– C++返回左值的函数调用可以出现在等号左边
– 左值表达式是右值表达式,反之则不一定成立

2.关于const

-定义const变量必须同时初始化(唯一的一次赋值机会)const是说明存储方式而不是数据类型

  特例:int  *const elems;   *const_cast<int**>(&elems) = new int[m]; //必须提升一级指针做去const操作

    //const_cast<int*>(elems) = new int[m];     //这样不行.

-const 修饰方式    

  指针本身是常量不可变   const char* pContent; 

  指针所指向的内容是常量不可变     char* const pContent; 

  都不可变   const char* const pContent; 

  备注 : 在结合性不明情况下,要有加括号的习惯。比如 *p[]和(*p)[] 逻辑意义不同;比如宏定义 宏参和宏体都须加括号 

-const 实际作用

  1.修饰形参引用

    “值传递”比“引用传递”多一个内存拷贝,为提高性能但又不希望函数改变形参对象,可以考虑将形参做成const型引用。(基本类型不存在构造析构,无此必要)

    eg.void func(A & Dst , const A& Source);

   2.修饰函数体

     void f(int i) const {} 将会构成void f(int i)  {} 的重载

    前者的目的是从编译器层面拦截修改数据成员的行为。(成员函数的后面加上了const,就表示这个成员函数不能对数据成员进行任何的修改动作)

3.关于static

-面向过程的static(指在类体外定义static的变量或函数)

  目的:使得该变量和函数只在本文件(以.c或.cpp结尾的文件)生效(可以避免多文件编译时命名冲突问题)。

  因为当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性(这一点可以从汇编层面可运行程序的数据段去理解,目前我理解的数据段分为三种全局、static、const数据段,不知道是否正确,《深入理解计算机系统》书中好像有讲,不大记得,若有人知道,望告知~)。

-

-

  备注:关于变量存储位置

    1.static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放。

    2.const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放。

      const局部变量存储在栈中,代码块结束时释放。

    3.局部变量存储在栈中,代码块结束时释放。

      malloc 或 new 的变量存储在堆中,由free、delete或关门函数(程序结束时调用,相似地,开工函数用于创建main进程)释放。

    注:当全局变量和静态局部变量未赋初值时,系统自动置为0。


    

 

原文地址:https://www.cnblogs.com/mangoczp/p/9529223.html