const的用法
- 如果用来修饰变量,说明该变量的值是不可以被改变;
const int value = 12 等价于
int const value = 12
- 如果修饰指针,分为两种,分别是指向常量的指针和指针常量;
指向常量字符串的指针,指针及地址可变,
但字符串是常量,不可修改,如:
const char* p1 = hello,word;
指针常量,指针及地址不可修改,指针及地址指向的
内容可以修改
char * const p1 = hello,word
- 常量引用,经常用作函数的形参,优点是引用避免了拷贝,同时限制函数执行过程中对引用值的修改;
void function1(const int Var);//传递过来的参数在函数内不可变,但是有拷贝
void function2(const int& Var);// 引用参数在函数内为常量,没有拷贝
static的用法
- 如果用来修饰全局变量时,该变量只在本文件内使用,同时变量值存储在静态区,在main函数执行前就已经分配了空间。
- 如果用来在函数内部修饰局部变量,该变量在函数执行完后不会被释放,一直保持上次执行的值。
void function()
{
static int a = 10;
......
}
- 在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()对于数组和指针的区别
- sizeof 对数组,得到整个数组所占空间大小,包含结束符所占空间。
char str[]= "hello,word";
int a = sizeof(str);
print(a)
a= 11
- sizeof 对指针,得到指针本身所占空间大小。
char *p = "hello,word"
int a = sizef(p)
print(a)
a = 4;//32位系统指针所占的空间是4个字节
字节对齐#pragma pack(n)的用法
- 指定结构,联合和类的包对齐方式
#pragma pack(4)//指定了4字节对齐方式
struct Test1
{
char c;
short sh;
int a;
float f;
int *p;
char *s;
double d;
};
sizeof(Test1) = 28Bytes
- 对于结构体,变量顺序不同,可能所占的空间大小就不一样,
下面的结构只是换了下变量顺序,所占空间就会发生变化
#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区别和用法
- c语言中的用法
定义了一个变量S,S的类型是struct Student类型
typedef struct Student {
int age;
} S;
等价于
// c
struct Student {
int age;
};
- 在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区别
- 默认struct 是 public 的,class 是 private 的。
- 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;
}
欢迎加入,共同交流,共同进步!
—