c++理解(一)

        本文主要探讨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;
}

结果示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值