美文网首页C++面试题集
C/C++关键字相关

C/C++关键字相关

作者: saviochen | 来源:发表于2017-07-08 16:56 被阅读56次

    1. volatile在程序设计中有什么作用?

    为提高存取速度,编译器优化有时会把变量读取到寄存器中,当以后再使用该变量时,直接从寄存器中取值,当变量在本线程里改变时,会同时把变量的新值复制到该寄存器中,以便保持一致。

    volatile是一个类型修饰符,用来修饰被不同线程访问和修改的变量。被volatile类型定义的对象,系统每次都从内存中读取数值,而非从寄存器中读取,以适应在多线程的情况下未知时间发生的变化。

    2. 断言ASSERT()是什么?

    ASSERT()一般称为断言,它是一个调试程序经常使用到的宏,定义在<assert.h>头文件中,通常用于判断程序中是否出现了非法的数据。在程序运行时,它计算括号内表达式的值,如果等于0,则程序报错,终止运行。

    注意:

    • ASSERT()捕获的是非法情况,只在debug版本中起作用,release版本则会被自动忽略。
    • ASSERT()与assert()的区别在于前者是宏,后者是ANSIC标准中规定的函数,两者功能相似,但后者可以利用在release版本中。

    3. 枚举的值如何计算?

    枚举的值默认为前一个数字加1。如果第一个枚举的值没有赋值,则其默认值为0

    enum{a, b = -2, c, d = 5, e};
    cout<<a<<" "<<c<<" "<<e<<endl;
    

    4. main()函数中argc和argv的含义?

    C语言的设计原则是把程序作为程序的构成模块。允许main()函数有两个参数或者没有参数。

    命令行参数有时用来启动一个程序,如int main(int argc, char* argv),其中第一个参数表示参数中命令行的数目,由程序自动统计,第二个参数argv是一个指向字符串的指针数组,参数数目没有内在限制。

    值得注意的是,argv[0]总是指向程序名,因此argc >= 1。

    5. 引用使用时应注意什么?

    • 不能返回局部变量,局部变量存储在栈区,在函数返回后将被销毁。
    • 不能返回函数内部分配的内存的引用。被函数返回的引用只是作为一个局部变量存在,由于没有赋予一个实际的变量,这个引用所指向的空间将无法释放,造成内存泄漏。
    • 返回类成员的引用时,最好返回常引用,防止类成员的封装性遭到破坏。
    • IO对象无拷贝或复制,只能通过传引用的方式传递。

    6. C++中,如何实现模板函数的外部调用?

    export关键字的目的是实现模板函数的外部调用,类似于extern关键字。

    为了访问其他代码文件中的变量或对象,对普通类型(包括基本数据类、结构和类)可以利用关键字extern来使用这些变量。

    对于模板类型,则可以在头文件中声明模板类和模板函数,在代码文件中使用关键字export来定义具体的模板了对象和模板函数。再其他用户代码包含声明头文件后,就可以使用这些对象和函数了。

    extern int n;
    extern struct A a;
    extern class Point p;
    export template<class T> class Stack<int> s;
    export template<class T> void f(T& t){ }
    

    7. explicit关键字有什么作用?

    explicit关键字可以阻止隐式转换,声明为explicit的构造函数不能在隐式转换使用。

    class TestE1
    {
    public:
        TestE1(int n){num = n;}
    private:
        int num;
    };
    
    class TestE2
    {
    public:
        explicit TestE2(int n){num = n;}
    private:
        int num;
    };
    
    int main()
    {
        TestE1 t1 = 12;//隐式调用其构造函数,成功
        TestE2 t2 = 12;//隐式调用其构造函数,失败
        TestE2 t3(12);//显示调用,成功
        return 0;
    }
    

    8. C语言中不能再函数内定义函数吗?

    不可以,即使主函数中也不可以,C语言只允许在函数中声明和嵌套调用。

    C语言中是不允许作嵌套的函数定义。因此程序中各个函数之间是平行的,不存在上一级函数和下一级函数的问题,这样是为了简化C语言编译器的逻辑性。

    9. C++中异常的处理方式?

    C++中处理异常的关键字有try,throw,catch,finally。try语句执行可能存在异常的代码, throw语句抛出异常,catch用于处理异常。finally后的语句块是不管异常是否发生都将执行的代码。

    以下代码演示要求用户输入一个小于等于10的数字,不满足要求则抛出异常。

    #include <iostream>
    #include <exception>
    int main()
    {
        int num = 0;
        while(cin >> num)
        {
            try
            {
                if(num > 10)
                    throw runtime_error("输入的数字大于10,不满足要求!");
            }
            catch (runtime_error err)
            {
                cout << err.what() <<"\n是否重新输入? 请选择 Y 或 N" << endl;
                char select;
                cin >> select;
                if(select == 'N' || !cin)
                    break;
                cin >> num;             
            }
        }
        return 0;
    };
    

    相关文章

      网友评论

        本文标题:C/C++关键字相关

        本文链接:https://www.haomeiwen.com/subject/onmrhxtx.html