c小知识

来源:互联网 发布:人工智能需要哪些技术 编辑:程序博客网 时间:2024/05/29 11:02

1.static关键字的作用和使用场景?


    。static的作用——隐藏,变量所有未加static前缀的全局变量和函数都具有全局可见性,假设有两个文件,其中一个文件中定义全局变量a,int a = 10;如果在另一个文件中声明extern int a;则a = 10,在这个文件中可以对其进行使用。但是如果定义的全局变量前加上static,即就是:static int a = 10;则在另一个文件中是不可见的。同理全局的函数也可以添加static。可以根据这一个特性在不同的文件中定义相同的函数名或者变量名,不需要担心命名冲突。

    。static的生命周期是全局的,直到程序结束后才会被释放,但是static局部变量的作用域与自动变量是相同的,只能在其作用域内进行使用,出了作用域虽然变量还存在,但是不能使用。static定义的变量会保存在静态区中,存储在静态区中的变量只会初始化一次,全局变量和static变量都存储在静态区中。

    。static类型的变量会默认初始化为0,在静态存储区中存储的变量都会默认初始化为0,所以全局变量也会默认为0,

    。类的静态成员函数是整个类的,而非类的对象的,它没有this指针。所以静态成员函数只能访问类中的静态成员函数或者静态成员变量。


    。不能将静态函数定义为虚函数。(?)

    。static的成员变量的初始化必须在类外,前面不需要加static。

    。静态数据成员必须进行初始化(编译时一般不会出错,链接会出错)

    。(3)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊 ,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。(?)

    。static成员变量能够进行继承。final修饰的变量是不能进行继承的。


2.构造函数


    。构造函数是与类名同名的函数,没有返回值和返回值类型,

    。构造函数分为两个阶段,第一个阶段为成员变量的初始化,第二个阶段为计算阶段。初始化阶段是将类中所有声明的成员变量按照其声明的顺序进行初始化,计算阶段即就是执行函数体的赋值部分。

    。初始化类的成员函数有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。对于基本类型两种方式差别不大,但是对于类类型来说,使用初始化列表的效率会高于在函数体内进行赋值,因为会少调用一次默认构造函数。

    。const成员变量必须使用初始化列表,不能对其进行赋值。没有默认构造函数的类类型,必须使用初始化列表对其初始化,因为使用初始化列表只会调用拷贝构造函数。子类中的构造函数必须使用初始化列表初始化基类成员变量。

    。构造函数是可以进行重载的,我们经常会写无参构造,有参构造,构造函数中的参数还可以是缺省的,缺省的参数必须从最后一个参数往前进行缺省,但是注意无参构造和全缺省构造函数是不能同时存在的,会存在二义性,编译器不知道我们想要执行的是无参还是全缺省。定义缺省时一定要注意不要存在冗余。

    。构造函数是在示列化对象时,编译器会自动进行调用,不能被显示的调用,在创建对象时,编译器会先给对象分配空间,然后自动调用构造函数。

    。构造函数是不能被继承的,子类中必须重新定义构造函数

    。构造函数一般定义为public属性

    。执行派生类构造函数的顺序:先调用基类构造函数,然后对子对象数据成员进行初始化,然后在执行派生类构造函数本身。(若派生类中没有子对象,则将不会进行子对象的初始化)

    。派生类的构造函数中,参数初始化列表中调用派生类的直接父类的构造函数,不需要显示的调用间接父类的构造函数,因为在调用直接父类的构造函数时,会自动先调用间接父类的构造函数。

    。构造与析构顺序是相反的,先构造的后析构。

    。多重继承中调用基类构造函数的顺序是按照 “声明”派生类时基类出现的顺序


0 0