Loading...
墨滴

小吉_电气码农

2021/08/03  阅读:47  主题:默认主题

C/C++干货

const的用法

  1. 如果用来修饰变量,说明该变量的值是不可以被改变;
const int value = 12 等价于 
int const value = 12
  1. 如果修饰指针,分为两种,分别是指向常量的指针和指针常量;
指向常量字符串的指针,指针及地址可变,
但字符串是常量,不可修改,如:
const char* p1 = hello,word;
指针常量,指针及地址不可修改,指针及地址指向的
内容可以修改
char * const p1 = hello,word
  1. 常量引用,经常用作函数的形参,优点是引用避免了拷贝,同时限制函数执行过程中对引用值的修改;
void function1(const int Var);//传递过来的参数在函数内不可变,但是有拷贝
void function2(const int& Var);// 引用参数在函数内为常量,没有拷贝

static的用法

  1. 如果用来修饰全局变量时,该变量只在本文件内使用,同时变量值存储在静态区,在main函数执行前就已经分配了空间。
  2. 如果用来在函数内部修饰局部变量,该变量在函数执行完后不会被释放,一直保持上次执行的值。
void function()
{
  static int a = 10;
  ......
}
  1. 在C++中如果用来修饰成员变量或者成员函数时,则只属于类本身,同时静态成员函数不能访问非静态成员变量。 应用场景一般在单例模式中经常用到
class A
{
  public:
    static int a;
    static void function()
    {
      print("this is static function")
    }
}
int main()
{
   A::a = 10;//访问静态成员变量
   A::function();//访问静态成员函数
}

断言:assert()的用法

断言其作用是如果条件判断错误,则会终止程序执行。

#include <assert.h>
assert( p != NULL );
//如果p==NULL,则程序会停止执行,并抛出异常

sizeof()对于数组和指针的区别

  1. sizeof 对数组,得到整个数组所占空间大小,包含结束符所占空间。
 char str[]= "hello,word";
 int a = sizeof(str);
 print(a)
 a= 11
  1. sizeof 对指针,得到指针本身所占空间大小。
char *p = "hello,word"
int a = sizef(p)
print(a)
a = 4;//32位系统指针所占的空间是4个字节

字节对齐#pragma pack(n)的用法

  1. 指定结构,联合和类的包对齐方式
#pragma pack(4)//指定了4字节对齐方式  
struct Test1  
{  
    char c;  
    short sh;  
    int a;  
    float f;  
    int *p;  
    char *s;  
    double d;  
};
sizeof(Test1) = 28Bytes
  1. 对于结构体,变量顺序不同,可能所占的空间大小就不一样, 下面的结构只是换了下变量顺序,所占空间就会发生变化
#pragma pack(4)//指定了4字节对齐方式  
struct Test2  
{  
    char c;  
    double d;  
    int a;  
    short sh;  
    float f;  
    int *p;  
    char *s;          
};
sizeof(Test2)=32Byte

struct 和 typedef struct区别和用法

  1. c语言中的用法
定义了一个变量S,S的类型是struct Student类型
typedef struct Student {
    int age; 
} S;
等价于
// c
struct Student { 
    int age; 
};
  1. 在C++ 中,要注意由于编译器定位符号的规则(搜索规则)改变,导致不同于C语言

如果在类标识符空间定义了结构体 struct Student {...};,使用 Student zhangsan时,编译器将搜索全局标识符表,Student 未找到,则在类标识符内搜索。 即表现为可以使用 Student 也可以使用 struct Student,如下:

// cpp
struct Student { 
    int age; 
};

void f( Student me ); // 正确,"struct" 关键字可省略

若定义了与 Student 同名函数之后,则 Student 只代表函数,不代表结构体,如下:
typedef struct Student { 
    int age; 
} S;

void Student() {}// 正确,定义后 "Student" 只代表此函数

//void S() {}// 错误,符号 "S" 已经被定义为一个 "struct Student" 的别名

int main() {
    Student(); 
    struct Student me;      // 或者 "S me";
    return 0;
}

C++ 中 struct 和 class区别

  1. 默认struct 是 public 的,class 是 private 的。
  2. struct 作为数据结构的实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认的成员变量访问控制是 private 的。

union 联合的用法

联合(union)是一种节省空间的特殊的类,一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。联合有如下特点:

  • 默认访问控制符为 public
  • 可以含有构造函数、析构函数
  • 不能含有引用类型的成员
  • 不能继承自其他类,不能作为基类
  • 不能含有虚函数
  • 匿名 union 在定义所在作用域可直接访问 union 成员
  • 匿名 union 不能包含 protected 成员或 private 成员
  • 全局匿名联合必须是静态(static)的 使用
#include<stdio.h>
union UnionTest {
    UnionTest() : i(10) {};//联合构造函数,初始化了i
    int i;
    double d;
};

static union {//全局静态匿名联合
    int i;
    double d;
};
int main() {
    UnionTest u;//实例化联合
    union {//定义了局部的联合
        int i;
        double d;
    };
    print("u.i=%d",u.i);//输出UnionTest联合的10
    ::i = 20;
    print("::i"=%d",::i);//输出全局静态匿名联合的20
    i = 30;
    print("
i"=%d",i);// 输出局部匿名联合的 30
    return 0;
}

欢迎加入,共同交流,共同进步! ---公众号 个人微信

小吉_电气码农

2021/08/03  阅读:47  主题:默认主题

作者介绍

小吉_电气码农