C语言复习:const ,static ,sizeof,宏

这篇博客是对于我个人的知识的复习,当然如果有某位大佬能够指出这里面有哪些概念含糊不清或者难懂,麻烦指出来感激不尽。

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)))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章