这篇博客是对于我个人的知识的复习,当然如果有某位大佬能够指出这里面有哪些概念含糊不清或者难懂,麻烦指出来感激不尽。
1.const
const:用const修饰的变量是“可读的”,即可以被访问,但是无法修改。
const可以修饰指针,数据成员,成员函数,类对象
修饰指针
指针常量和常量指针
顾名思义,类似
int* const p;//指针常量,const修饰p
const int* q;//常量指针
int const *r;//常量指针
- 指针常量是一个常量,不能修改该常量的值,但是可以改变该常量指向内存的储存的值。
- 常量指针是一个指针,可以改变该指针的值,但是无法改变常量指向内存的储存的值。
- 可以通过const与*的位置进行判断类型。
修饰数据成员
修饰数据成员后,数据成员变成“只读”形式,不能被修改,只能被初始化在初始化列表中,不能被修改。
class Const_test{
public:
Const_test(int v):value(v){
}
private:
const int value;
};
修饰成员函数
const修饰的成员函数,能够访问const成员变量和非const变量,但是只能调用const修饰的成员函数。
class Const_test{
public:
Const_test(int v):value(v){
}
void display()const{
age = 10; //错误
int temp = 10; //正确
temp = age;
print();//错误
}
void dispaly(){//重载
}
void print(){
}
private:
int age;
const int value;
};
修饰类对象
const修饰函数,是从函数层面,不修改数据。const修饰对象,是从对象的层面,不修改数据。只能调用const成员函数。
面试题const和define宏的区别?
const修饰的变量,会分配内存的变量,而宏在预处理过程中进行的字符串替换
const修饰的变量,在编译上会有安全检查,本质上仍然可以修改,只是编译器让其无法修改,可以用指针的方式来绕过编译器,对const变量进行修改。
define是将字符进行替换,很容易造成隐秘的错误。
2.static
- 声明static的函数无法被其他的源程序所引用
- 声明static的成员对象,不属于单个对象,而属于这个类,保存在静态区中,在类外进行初始化
- 声明static的成员函数,只能访问static变量和static函数,和声明static的成员对象类似,不属于单个对象,而属于这个类,调用使用类名::函数名
3.sizeof
sizeof是关键词而不是函数,用来计算变量大小
面试题说出sizeof和strlen的区别
- sizeof是关键词,strlen是函数
- strlen传入参数为字符串,且必须以\0结尾,计数器遇到\0会退出
- sizeof计算的是传入的操作数的字节大小,传入的操作数可以是int char 或者函数,例如int g() sizeof(g()) == sizeof(int)
- sizeof在大部分的编译器中都是编译时,运算,strlen函数则时在程序运行时进行运算。
- sizeof计算结构体遵循内存对齐,且只计算栈上的成员,对于静态变量不会进行运算,无论有多少个虚函数,只计算一个虚函数指针的大小。
- sizeof计算继承父类的子类的对象大小,因存在继承关系,所以派生类的sizeof结果需要加上基类的sizeof结果,如果子类和父类都有虚函数,只计算一次虚函数的指针大小。
#include<iostream>
using namespace std;
struct A1 {
int a;
char c;
static char c1; //BSS段,不属于栈区
A1();
~A1() {}
virtual void f1() {}
virtual void f2() {}
virtual void f3() {}
};
struct A2 : public A1{
float f;
void f1(){}
void f2(){}
void f3(){}
virtual void g1(){}
virtual void g2(){}
};
int main(int argc, char* argv[]) {
cout << sizeof(A1) << endl; //12
cout << sizeof(A2) << endl; //16
getchar();
return 0;
}
面试题写一个三数求最大的宏函数
#define MAX(a,b,c) (((a)>(b))?((a)>(c)?(a):(c)):((b)>(c)?(b):(c)))