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。