本文主要探讨c++相关知识包含地址,函数,内存等。
虚拟地址空间
全局变量初始化为0和未初始化位于bss,初始化为非0位于data
静态变量初始化为0和未初始化位于bss,初始化为非0位于data
局部局变量运行时转化为指令
char *p = "hello";定义在text
函数形参
函数定义形参时从左向右依次赋值且不能跳跃fun(int a = 1, int b, int c = 2)不符合要求,fun(int a, int b, int c = 2)符合要求
函数调用形参从左向右依次赋值,当传值数小于参数列表时,首先保证未有默认参数,其余依次从左到右赋值替换默认参数
函数调用传参个数大于等于未有默认参数个数小于等于总参数
函数不同参数导致函数运行效率不同,传值fun(1,2,3) > 默认形参fun() > 参数fun(a,b,c)
函数可在定义和多次声明,调用时参数列表会合并,故参数列表不能重复给定默认参数
inline函数
函数调用的开销(压栈,开辟和回退栈帧)大于函数展开执行的开销时使用inline函数
inline函数在调用处展开不存在调用时产生的符号表
inline关键字只是建议编译器将函数处理成内联函数,定义递归函数时可能依旧是函数调用
release版本inline定义函数生成内联函数,debug版本任为函数调用
函数重载(函数名和参数列表)
C++编译后的函数符号包含函数名和参数列表故c++函数可重载,c编译后的函数只包含函数名故不支持重载
函数名相同参数列表个数和类型不同则未函数重载,只有返回值不同不为重载
被重载的函数必须在同一作用域才为重载,局部重载定义会屏蔽其他所有重载函数
const和volatile修饰不能改变参数类型,故添加和不添加const和volatile修饰的参数列表相同不为函数重载
c/c++相互调用,被调用的函数放在extern "C"中
const
const修饰的变量不能做左值,初始化后不能修改值
c/c++的区别:
c将const修饰当做变量处理,const int a = 1;int arry[a];不符合编译
c++将const修饰的变量用常量替代,const int a = 1;int arry[a];符合编译
c定义const变量可不初始化,const int a;
c++定义const变量必须初始化,初始化为值则未常量(const int a = 1;),初始化为变量为常变量(const int a = b;)
const右边无,const不属于类型,const int* <= int *,int* const * <= int**两种类型允许
引用类型判断:int &a = b; <==> int *a = &b;转化后再判断
new/delete和malloc/free
malloc/free时库函数,new/delete是运算符
new申请失败返回bad_alloc异常,malloc失败返回-1
new用法:
int data = 0;const int *p = new(&data) int[3]{1};
const int *p = new(nothrow) const int[3]{1};delete [] p;
demo1:
函数形参
结构图:
示例代码:
run.sh
#!/bin/bash
if [ -f ./Makefile ]
then
make clean
fi
cmake .
make
echo "---------------------------------"
./pro
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.28) #最低版本要求
SET(CMAKE_CXX_COMPILER "g++-11") #设置g++编译器
PROJECT(CLASS) #设置工程名
MESSAGE(STATUS "CPP test") #打印消息
ADD_EXECUTABLE(pro test.cpp) #生成可执行文件
clean.sh
rm -rf CMakeCache.txt CMakeFiles Makefile cmake_install.cmake *.o pro
test.cpp
#include <iostream>
using namespace std;
int fun(int a, int b, int c = 3,int d = 4)
{
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
cout << "d: " << d << endl;
return a + b + c + d;
}
int fun(int a = 1, int b = 2, int c,int d);
int func(int a, int b, int c = 3,int d = 4)
{
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
cout << "d: " << d << endl;
return a + b + c + d;
}
int func(int a, int b = 2, int c,int d);
int main()
{
int ret;
ret = fun();
cout << "ret :" << ret << endl;
ret = fun(8,8,8);
cout << "ret :" << ret << endl;
ret = func(1);
cout << "ret :" << ret << endl;
ret = func(1,8);
cout << "ret :" << ret << endl;
return 0;
}
结果示例:
demo2:
inline
func.cpp
#include <iostream>
inline int func(int a,int b)
{
return a + b;
}
int main()
{
int ret = func(1,2);
return 0;
}
结果示例:
demo3:
new/free
结构图:
示例代码:
run.sh
#!/bin/bash
if [ -f ./Makefile ]
then
make clean
fi
cmake .
make
echo "---------------------------------"
./pro
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.28) #最低版本要求
SET(CMAKE_CXX_COMPILER "g++-11") #设置g++编译器
PROJECT(CLASS) #设置工程名
MESSAGE(STATUS "CPP test") #打印消息
ADD_EXECUTABLE(pro test.cpp) #生成可执行文件
clean.sh
rm -rf CMakeCache.txt CMakeFiles Makefile cmake_install.cmake *.o pro
test.cpp
#include <iostream>
using namespace std;
int main()
{
double *p;
try
{
p = new double[sizeof(double) * 99999999999999];
}
catch(bad_alloc &e)
{
cout << e.what() << endl;
return -1;
}
delete p;
return 0;
}
结果示例: