static 用法:
for C language:
1.表示存储属性:
存储于静态变量区,static int a;
由于存储于静态变量区,导致变量的记忆性[不会由于栈的回收而丢失],int fun(){ static int a;...}
2.链接属性
说明变量或者函数内部链接的,只在本文件有效,及时在另外一个文件extern引用也不可以。
int the file1:
static int a; static int fun(){};
int the file2:
extern int local; extern void print_h();
for c++ language:
兼容c language;
特有的:
sattic 对象[函数和变量]是类所有,不会为每个对象创建一个,只有一个类所有的。 class A{int a; int fun(){};}; class B{static class A a1;};
对于 类内部的static 内部链接属性也受限于外部类的作用域【可能可以在外部访问】。class A{ static int a;};
对于 static 对象[非类内部的static],也是内部链接的.
const 用法:
const是对编译器说明 ”不应该改变的[只读的]“,如果改变,编译器会报错!
【到底const变量可不可以改变,[有可以的,也有不可以的]求大神指点】
const或许可以取代c中的#define
for C language:
1.表示[只读的]:
修饰变量,const int a=9;(但c中允许const int a; 郁闷,c++不可以)
修饰传入参数 int fun(const int a);
2.链接属性
说明变量或者函数内部链接的,只在本文件有效,及时在另外一个文件extern引用也不可以。
int the file1:
static int a; static int fun(){};
int the file2:
extern int local; extern void print_h();
for c++ language:
const 优点:便于进行类型检查,便于编译器检测不应该修改的数值。
1. 限定符声明变量只能被读 ,const int a=5; [必须初始化],在另一连接文件[只能在.h头文件]中引用const常量 ,extern const int i;
2.修饰类的成员函数[非成员函数不可以定义为 const 函数]
const 成员函数禁止修改对象的所有变量[对象],可以修改类和全局的变量[对象]
class A{ void print(int a) const {};};
原因[引用帖子]:
/-----------------------------------------------------------------------------------
成员函数都会在自己的形参表中加一个参数:这个参数是指向函数所在类的类型的CONST指针.比如:
class A
{
private:
int n;
public:
void set()
{ n=10; };
};
上边的set函数,是给n赋值的,但是它怎么知道是给哪一个对象的n赋值呢?这就需要在参数中告诉它。编译器为我们作了这些工作。实际生成的set函数可以理解成这样的:
public A::set(A* const this)
{ this->n=10; }
而我们调用的时候其实是这样的:
A a;
A::set(&a);
理解这个对你理解你的这个问题很关键.如果是const成员函数,编译器所作的这项工作也会改变。它会生成一个指向cosnt对象的const指针。所以你不能通过this来改变它所指向的对象。但是要知道static对象并不需要this指针来改变,所以它和const函数是没关系的。
以上内容,仅代表个人观点。
/-----------------------------------------------------------------------------------
3.修饰函数[主要是成员函数]的返回值
const可以用于修饰任何类型,只要返回值类型不是void,const就可以用来修饰返回值的类型。但实际上const用于修饰非引用的返回值类型是没有意义的,
因为返回值一般都会被赋值给另一个变量,此时用于传递返回值的对象已经被销毁,修饰返回值类型的const的作用也就终结了。
当返回值是引用类型时,如果该引用的值不希望被修改是可以声明为常引用的,例如:
class A
{
public:
const A& operator=(const A& a) { return *this; }
};
int main( void )
{
A a, b, c, d;
a = b = c = d; // ok
((a=b)=c)=d; // error,更加合乎常理
return 0;
}
4.修饰函数的参数[防止意外改动,例如数组大小]
void print(const int array[],const int size); void print(const A &a)[成员函数]; void print(const int *const array,const int size);
void char* getmem(size_t size); const char *p=getmem();
注意:应该按需要使用const,好的使用会使代码更健壮,糟糕的就是难维护的代码。
对于语言内置类型的输入参数,不应该将“值传递”的方式改为“const 引用传递”,这不会提高效率。
void fun(int a) 改为void fun(const int &a)。
语言内置类型的临时变量的无需构造,析构。
相反 类对象临时对象需要构造,复制,析构,影响效率。而const引用只是别名,不生成临时对象
嵌入式面试题总结
最新推荐文章于 2025-01-15 16:58:37 发布