1、强制类型转换的四个参数

  • static_cast
  • 用于基本类型间的转换
  • 不能用于基本类型指针将的转换
  • 用于有继承关系类对象间的转换和类指针之间的转换
  • const_cast
  • 用于去除变量的只读属性
  • 强制转换目标类型必须是指针和引用
  • reinterpret_cast
  • 用于指针类型间的强制转换
  • 用于整数和指针类型间的强制转换
  • dynamic_cast
  • 用于有继承关系的类指针之间的转换
  • 用于有交叉关系的指针间转换
  • 具有类功能检查
  • 需要虚函数支持


    2、const常量的判别标准
  • 只有用字面量初始化const常量才会进入符号表
  • 使用 其他变量初始化的const常量仍然是只读变量
  • 被volatile修饰的const常量不会进入符号表
  • 编译器期间不能直接确定的初始值的const标识符,都被作为只读变量处理。
#include <stdio.h>

int main()
{
    const int x = 1;
    const int& rx = x;

    int& nrx = const_cast<int&>(rx);//引用已被去掉的只读属性的变量

    nrx = 5;

    printf("x = %d\n", x);//1,为常量以在符号表中
    printf("rx = %d\n", rx);//rx被nrx引用,值为5
    printf("nrx = %d\n", nrx);//ngx为5,空间地址和rx相同
    printf("&x = %p\n", &x);
    printf("&rx = %p\n", &rx);
    printf("&nrx = %p\n", &nrx);

    volatile const int y = 2;
    int* p = const_cast<int*>(&y);

    *p = 6;

    printf("y = %d\n", y);
    printf("p = %p\n", p);

    const int z = y;

    p = const_cast<int*>(&z);

    *p = 7;

    printf("z = %d\n", z);
    printf("p = %p\n", p);

    char c = 'c';
    char& rc = c;
    const int& trc = c;//引用初始类型不同的,将生成一个只读变量。

    rc = 'a';

    printf("c = %c\n", c);//a
    printf("rc = %c\n", rc);//a
    printf("trc = %c\n", trc);//c

    return 0;
}
  1. C++不支持引用数组

    
    #include <stdio.h>
    
    int a = 1;
    
    struct SV
    {
      int& x;
      int& y;
      int& z;
    };
    
    int main()
    {
      int b = 2;
      int* pc = new int(3);
      SV sv = {a, b, *pc};
      int& array[] = {a, b, *pc}; // error  &array[1] - &array[0] = ?  Expected ==> 4
    
      printf("&sv.x = %p\n", &sv.x);
      printf("&sv.y = %p\n", &sv.y);
      printf("&sv.z = %p\n", &sv.z);
    
      delete pc;
    
      return 0;
    }

4、函数的可变参数
1、stdarg.h 标准头文件
-va_list 参数集合
-va_arg 取具体参数值
-va_start 标识参数访问开始
-va_end 标识参数访问的结束

例子:


#include <stdio.h>
#include <stdarg.h>

float average(int n, ...)
{
    va_list args;
    int i = 0;
    float sum = 0;

    va_start(args, n);

    for(i=0; i<n; i++)
    {
        sum += va_arg(args, int);
    }

    va_end(args);

    return sum / n;
}

int main()
{
    printf("%f\n", average(5, 1, 2, 3, 4, 5));
    printf("%f\n", average(4, 1, 2, 3, 4));

    return 0;
}

内联函数
g++:attribute((always_inline))
msvc:__forceinline

#include <stdio.h>

__forceinline
__attribute__((always_inline))
inline 
int add_inline(int n);

int main(int argc, char *argv[])
{
    int r = add_inline(10);

    printf(" r = %d\n", r);

    return 0;
}

inline int add_inline(int n)
{
    int ret = 0;

    for(int i=0; i<n; i++)
    {
        ret += i;
    }

    return ret;
}

g++编译器 编译c++文件通过宏调用c库

extern “C”
{

    #include "add.h"
}

__cplusplus 宏代码块

------》来源于狄泰软件学院--笔记