现在的位置: 首页 > 综合 > 正文

c++ 面试题

2018年12月13日 ⁄ 综合 ⁄ 共 4973字 ⁄ 字号 评论关闭

转自:http://blog.csdn.net/odola/article/details/4408136

char str1[]       = "abc";
char str2[]       = "abc";
const char str3[] = "abc"; 
const char str4[] = "abc"; 
const char* str5 = "abc";
const char* str6 = "abc";
cout << boolalpha << ( str1==str2 ) << endl; // 输出什么? false
Cout << boolalpha << ( str3==str4 ) << endl; // 输出什么? false
Cout << boolalpha << ( str5==str6 ) << endl; // 输出什么? true
答:
str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和 str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等


2. 非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A?[C++中等]
答:
a. class B : public A { ……} // B公有继承自A,可以是间接继承的
b. class B { operator A( ); } // B实现了隐式转化为A的转化
c. class A { A( const B& ); } // A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数
d. A& operator= ( const A& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个


3. 以下代码中的两个sizeof用法有问题吗?[C易]
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"; //含有6个字符,最后一个为结束符
cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答:
在调用UpperCase的函数时,实际传入的是一个地址指针。在函数参数中,char str[]与char *效果是一样的,这样的话实际上uppercase中的sizeof(str)实际上是求指针占了多少
个字节,是4而不是字符的长度6.解决办法:需要给UpperCase函数加一个参数,void UpperCase(
char str[],int n);这个n是传进来的数组的长度。
void UpperCase( char str[],int n) // 将 str 中的小写字母转换成大写字母
{
    for( size_t i=0; i<n; ++i )
        if( 'a'<=str[i] && str[i]<='z' )
            str[i] -= ('a'-'A' );
}

 

4. 以下代码有什么问题?[C难]
void char2Hex( char c ) // 将字符以16进制表示
{
    char ch = c/0x10 + '0'; if( ch > '9' ) ch += ('A'-'9'-1);
    char cl = c%0x10 + '0'; if( cl > '9' ) cl += ('A'-'9'-1);
    cout << ch << cl << ' ';
}
char str[] = "I love 中国";
for( size_t i=0; i<strlen(str); ++i )
    char2Hex( str[i] );
cout << endl;
答:

只对ASCII字符有效,对汉字不适用,汉字已经超出256了。


4. 以下代码有什么问题?[C++易]
struct Test
{
    Test( int ) {}
    Test() {}
    void fun() {}
};
void main( void )
{
    Test a(1);
    a.fun();
    Test b();
    b.fun();
}
答:Test b(); 应该直接写Test b或者Test *b=new Test();


5. 以下代码有什么问题?[C++易]
cout << (true?1:"1") << endl;
答:三元表达式“?:”问号后面的两个操作数必须为同一类型。


6. 以下代码能够编译通过吗,为什么?[C++易]
unsigned int const size1 = 2;
char str1[ size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];
答:不能。在编译阶段,由于temp=0。不能初始化一个char 数组的长度为0。声明数组时指定元素数目,它必须是整型常数或const值,该const的值也必须在编译时期确定,但是
在这里size2的值在运行时才确定为temp的值。要求所有的值在编译时是已知的!!数组不能用变量作为长度进行声明,因为变量的值是在运行时指定。


7. 以下代码中的输出语句输出0吗,为什么?[C++易]
struct CLS
{
    int m_i;
    CLS( int i ) : m_i(i) {}
    CLS()
    {
        CLS(0);
    }
};
CLS obj;
cout << obj.m_i << endl;
答:不能。因为只是在CLS obj的时候,在构造函数CLS()中生成的临时的CLS对象里边的m_i进行了赋值!


8. C++中的空类,默认产生哪些类成员函数?[C++易]
答:
class Empty
{
public:
    Empty();                                         // 默认构造函数
    Empty( const Empty& );                    // 拷贝构造函数
    ~Empty();                                       // 析构函数
    Empty& operator=( const Empty& );   // 赋值运算符
    Empty* operator&();                        // 取址运算符
    const Empty* operator&() const;       // 取址运算符 const
};

需要注意的是只有当你需要用到这些函数的时候,编译器才会去定义它们。


9. 以下两条输出语句分别输出什么?[C++难]
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?
Float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么?
:(1)(2)分别输出false和true。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何
实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。
这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。


10. 以下反向遍历array数组的方法有什么错误?[STL易]
vector array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 3 );

for( vector::size_type i=array.size()-1; i>=0; --I ) // 反向遍历array数组
{
    cout << array[i] << endl;
}

答:首先数组定义有误,应加上类型参数:vector<int> array。其次vector::size_type被定义为unsigned int,即无符号数,这样做为循环变量的i为0时再减1就会变成最大的整数,导致循环失去控制。

 


11. 以下代码有什么问题?[STL易]
typedef vector<int> IntArray;
IntArray array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 2 );
array.push_back( 4 );
// 删除array数组中所有的2
for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
{
    if( 2 == *itor ) array.erase( itor );
}
答:当删除了第一个2之后,这个时候的iterator指向vector的第三个元素,此时的vector的元素为[1,2,4],这样就跳过了第二个2,而直接检查了4,所以没有删干净。正确方

法是:
for(Intarray::iterator itor=array.begin();itor!=array.end();++itor)
{
   if(2==*itor)
   {
       array.erase(itor);
       itor--; //在erase之后使迭代器回退一位
    }
}

for(Intarray::iterator it = array.begin();it!=array.end();)

{

if(*it == 2)

it = array.erase(it);

else

           ++it;

}


如果是set也一样

set<int> s;

s.inert(3);

....


for(set<int>::iterator it = s.begin();it!=s.end();++it)

{

if(*it == 2)

            it = s.earae(it);

       else

           ++it;

}

12. 写一个函数,完成内存之间的拷贝。[考虑问题是否全面]
答:
void* mymemcpy( void *dest, const void *src, size_t count )
{
    char* pdest = static_cast<char*>( dest );
    const char* psrc = static_cast<const char*>( src );
    if( pdest>psrc && pdest<psrc+cout ) 能考虑到这种情况就行了
    {
        for( size_t i=count-1; i!=-1; --I )
                pdest[i] = psrc[i];
    }
    else
    {
        for( size_t i=0; i<count; ++I )
            pdest[i] = psrc[i];
    }
    return dest;
}
int main( void )
{
    char str[] = "0123456789";
    mymemcpy( str+1, str+0, 9 );
    cout << str << endl;

    system( "Pause" );
    return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.