C++笔试题

  • Post author:
  • Post category:其他


1. 用预处理指令#define声明一个常数,用以表明1年中有多少秒?

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

2. 写一个标准宏MIN, 这个宏输入两个参数并返回较小的一个

#define MIN(a,b) (a>b?b:a)

3. 用变量a给出下面的定义

1)一个整型数

int a

2)一个指向整型数的指针

int *a

3)一个指向指针的指针,它指向的指针是指向一个整型数

4)一个有10个整型数的数组

5)一个有10个指针的数组,该指针是指向一个整型数的

6)一个指向有10个整型数数组的指针

7)一个指向函数的指针,该函数有一个整形参数并返回一个整型数

8)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

int *a[10];   //指向int类型的指针数组a[10]

int (*a)[10]; //指向有10个int类型数组的指针a

int (*a)(int);//函数指针,指向有一个参数并且返回类型 均为int的函数

int (*a[10])(int); //函数指针的数组,指向有一个参数并且返回类型均为int的函数的数组

4. 关键字static的作用是什么

限定作用域;保持变量内容持久化。

5. 关键字const是什么含义

定义常变量

6. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的 ANSI编译器。写代码去完成这一任务。

int *ptr;

ptr = (int*)0x67a9;

*ptr = 0xaa66;

7. 求下面函数的返回值(即求x转化为二进制之后1的个数)

int func(x)
 {
    int countx = 0;     
     while (x)
     {
      countx ++; 
      x = x & (x - 1); 
     } 
     return countx;
 }

8. 什么是引用?申明和使用引用要注意哪些问题?

引用就是某个目标变量的别名(

alias

),对引用的操作就是对变量的直接操作,它们的效果是完全一样的。声明一个引用时,必须要对其初始化,将其与某个变量相关联。


引用声明完毕后,相当于目标变量有两个名称—-原名和引用名,不能把引用名再做为其他变量的的别名。声明一个引用,不是新定义一个变量,他只表示该引用是目标变量的一个别名。


引用不是一种新的数据类型,因此它本身不占存储单元,系统也不会为它分配存储单元。


不能建立数组的引用。

9. 在什么时候需要常引用

引用只读,不能对对象进行修改的时候;利用引用提高程序的效率

10. 引用和指针的区别是什么(见收藏)

11. 已知strcpy的函数原型

char * strcpy ( char * strDest , const char * strSrc )
{
    undefined assert (( strDest != NULL ) && ( strSrc != NULL )); //这个必须要啊,判断指针是否为空
    char * address = strDest ;
    while ( (* strDest ++ = * strSrc ++) != ‘\0’ ) NULL ;

    return address ;
}

12. 已知String类定义如下:

class String 
{   
public:    
    String(const char *str = NULL); // 通用构造函数    
    String(const String &another); // 拷贝构造函数    
    ~ String(); // 析构函数    
    String & operater =(const String &rhs); // 赋值函数   
    private:    char *m_data; // 用于保存字符串 }; 

尝试写出类的成员函数实现。

#define _STRING
#ifdef _STRING
class String
{
public:
    String(const char *str = NULL); // 普通构造函数
    String(const String &other);        // 拷贝构造函数
    ~String(void);                     // 析构函数
    String & operator=(const String &other);    // 赋值函数
private:
    char    *m_data;                // 用于保存字符串
};

//bool operator>(const ver_weight &comp)const{
// String的析构函数

String::~String(void)               // 3分
{
    delete[] m_data;
    // 由于m_data是内部数据类型,也可以写成 delete m_data;
}

// String的普通构造函数
String::String(const char *str)      // 6分
{
    if (str == NULL)
    {
        m_data = new char[1];
        *m_data = '\0';
    }
    else
    {
        int length = strlen(str);
        m_data = new char[length + 1];
        strcpy(m_data, str);
    }
}

// 拷贝构造函数

String::String(const String &other)   // 3分
{
    int length = strlen(other.m_data);
    m_data = new char[length + 1];
    strcpy(m_data, other.m_data);
}

// 赋值函数
String & String::operator=(const String &other)    // 13分
{
    // (1) 检查自赋值                     // 4分
    if (this == &other)
        return *this;
    // (2) 释放原有的内存资源            // 3分
    delete[] m_data;
    // (3)分配新的内存资源,并复制内容 // 3分
    int length = strlen(other.m_data);
    m_data = new char[length + 1];
    strcpy(m_data, other.m_data);
    // (4)返回本对象的引用            // 3分
    return *this;
}

int main() 
{
    String str1("I am 1");
    String str2(str1);
    String str3 = str1;
    return 1;
}
#endif

13. .h头文件中的ifndef/define/endif的作用

防止该头文件被重复引用

14. #include<file.h>与#include “file.h”的区别

15. 在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”

首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。extern “C”是连接申明(linkage declaration),被extern “C”修饰的变量和函数是按照

C语言

方式编译和连接的。作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与

c语言

的不同。例如,假设某个函数的原型为:void foo( int x, int y );该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。

所以,可以用一句话概括extern “C”这个声明的真实目的:

解决名字匹配问题,实现C++与C的混合编程。


16. 多态的作用

1) 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。

2) 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。

17. main函数执行以前,还会执行什么代码?

全局函数的构造函数

18. 分别写出BOOL、int、float、指针类型的变量a与“零”比较的语句

BOOL:
    if(a)  or  if(!a);
int:
    if(0 == a);
float:
    const float EXP = 0.000001;
    if(a<EXP && a>-EXP);
pointer:
    if(a != NULL)  or  if(a == NULL);

18. 请说出const与#define相比,有何优点

见收藏

19. 写一个函数找出一个整数数组中,第二大的数

20. 以下代码中的两个sizeof用法有问题吗

void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
{
for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}

char str[] = "aBcDe"
cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;

主函数中的sizeof没有问题,upper_case中的sizeof使用错误,因为数组作为参数传递会退化为指针,upper_case中的str实际上是char*指针,它的sizeof为指针类型大小而非数组大小。

21. 以下代码有什么问题

cout<<"(true?1:"1")<<endl;

true?1:”1″

1和”1″是两个不同类型的, 编译无法通过

22. C++中的空类,默认产生哪些类成员函数

默认构造函数

析构函数

拷贝构造函数

赋值运算符(operator=)

取址运算符(operator&)(一对,一个非const的,一个const的)

23. 编写一个函数,函数接收一个字符串,是由十六进制数组成的一组字符串,函数的功能是把接到的这组字符串转换成十进制数字.并将十进制数字返回

int hex2dec(){
string s;
int sum=0;
cout<<"请输入一个16进制的字符串:"<<endl;
cin>>s;
for(i=2;i<=s.length()-1;i++){
    if(s[i]>='a'&&s[i]<='f'){
        num=s[i]-'a'+10;
    }else{
        num=s[i]-'1'+1;
    }
    int n=s.length()-1-i;
    int flag=1;
    while(n--){
        flag=flag*16;
    }
    sum=sum+flag*num;
}
return sum;
}



版权声明:本文为weixin_45685191原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。