41.c++中结构体和类可以使用malloc来动态分配内存吗?

不可以,在c++中,结构体和类都必须使用new来建立对象
malloc是库函数,而new是运算符,结构体和类需要创建和销毁,而库函数不方便编译器控制。

42.那些情况算什么函数重载?

1.参数不同
2.参数类型不同
3.参数顺序不同
注意:参数的返回值不同并不会产生重载,只会产生错误.

43.c++中在一个类中声明一个成员变量为static ,有什么用?

在 C++ 类的成员变量被声明为 static(称为静态成员变量)意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,也就是说不管创建多少对象, static修饰的变量只占有一块内存。其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。修饰的变量只占有一块内存。其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。 static是加了访问控制的全局变量,不被继承。

44.C++中为什么用模板类。

1.提高代码的利用率
2.编译的时候不进行类型检查增加了类型的安全性.

45.函数模板和类模板有什么区别

函数模板是由编译器在处理函数调用时候决定的,类模板是由程序员实例时决定的.

46.介绍一下 STL ,详细说明 STL 如何实现vector?

STL即C++中的Standard Template Library(标准模板库)。STL是C++编程语言的一个重要组成部分,它包含了一系列高度泛型的容器(containers)、算法(algorithms)、迭代器(iterators)和其他一些辅助模板,如函数对象(functors)和适配器(adapters)。这些组件的设计目的是为了提高代码的重用性、效率和可维护性。

47.介绍一下STL中的Vector

Vector是C++标准模板库(STL)中的一种容器,它提供了动态数组的功能。与静态数组相比,vector的主要优势在于其大小可以在运行时自动调整。以下是关于C++中vector的几个关键特性:
(1)连续存储:尽管大小可变,vector中的元素仍然保证存储在一块连续的内存中。这使得通过下标访问元素(随机访问)非常快速,时间复杂度为O(1)。
(2)动态扩展:当向vector添加元素超过其当前容量时,vector会自动分配更大的内存块,并将原有元素复制到新位置,然后释放旧内存。这个过程有时被称为“重新分配”或“扩容”。
(3)常用操作:vector支持常见的集合操作,如插入(push_back, insert)、删除(pop_back, erase)、访问(at, front, back)以及检查容量(size, capacity)等。
(4)类型参数化:作为一个模板,vector可以存储任何类型的数据,包括基本类型(如int、double)和用户自定义类型。
(5)迭代器:vector提供了迭代器,允许以统一的方式遍历容器中的元素,迭代器类型包括正向迭代器、反向迭代器等,它们兼容STL的算法。

48.请你谈谈 const 的作用?

在C++中,const关键字是一个非常重要的特性,它用于定义不可修改的实体,确保程序的某些部分在执行过程中不会被意外修改。const有多种用途,以下是其主要作用:
(1)定义变量,这意味着一旦给变量赋予初始值后,它的值就不能再改变。
(2)指针常量:
(3)修饰函数参数:当函数参数前加const,表示该参数在函数内部不会被修改。
(4)修饰函数返回值:表示函数返回的对象或引用是不可变的,有助于提高代码的清晰度和安全性。
(5)修饰成员函数:const成员函数承诺不修改类的任何成员变量(除了那些用mutable关键字标记的成员),它通常用于访问函数。

49.所有的运算符都可以重载吗?

不可以,有一些运算符是不可以重载的.
例如三目运算符(?:)命名空间( ::) . 等

50.基类的析构函数不是虚函数,会带来什么问题?

子类的成员所占用的内存可能无法释放.

51.不使用if,?:switch,写一个函数判断a和b哪一个大的语句段

(a+b + abs(a-b) ) / 2

52.不使用第三个变量,交换整数a和b的值?

a = a + b;
b = a - b;
a = a - b ;

53.如何打印源程序文件名和源程序的行号?

c++和c语言中有很多系统的宏定义,这些宏定义大多数以_开头,结尾.
打印源文件名的句子是_FILE

打印行号的句子是_LINE_
编译日期是_DATA_
当前的编译时间_TIME
c++中特有的_cplusplus

54.写出运行结果: :

char str[] = "world"; cout << sizeof(str);
char *p = str; cout << sizeof(p);
char i = 10; cout<< sizeof(i);
void *pp = malloc(10); cout << sizeof(p);
第一个显示的是字符串的长度为6;
第二个显示的指针的长度为4,
第三个是字符的长度,为1
第四个是指针的长度为4

55.int i = 5, b = 7;cout << (i+++b) <<endl;不用调试,请说出,以上代码在 gcc编译过后的执行结果!

首先,+++是由+和++两个符号组成的,
其中++是单目运算符,优先级顺序排在第二位,结合顺序是从右向左.
其中+是双目运算符,优先级顺序排在第第四位,结合顺序是从左到右.
所以先计算i++,然后计算i+b ,答案为12.

56.c++中什么是左值什么是右值

在C++中,左值(lvalue)和右值(rvalue)是对表达式的分类,它们描述了表达式在内存中的特性和如何参与赋值等操作。

左值(lvalue):

左值是能够出现在赋值表达式左边的表达式。这意味着它代表了一个可以被修改的对象或者内存位置。
左值通常有一个持久的身份和存储位置,因此可以取地址(使用&操作符)。
具名变量、数组元素、结构体或类的成员等都是左值的例子。
从C++11开始,左值还可以进一步分为普通左值和常量左值,后者如const修饰的变量,虽然不可修改,但仍然可以出现在赋值表达式的左侧作为被赋值的目标。
右值(rvalue):

右值是通常只能出现在赋值表达式右边的表达式,它们代表临时对象或者不需要持久存储的身份。
右值分为两种主要类型:纯右值(prvalues)和将亡值(xvalues)。
纯右值(pure rvalues)通常是临时对象,比如字面量、函数返回的非引用类型值、或者通过类型转换构造的临时对象。这些值没有固定的存储位置,不能取地址。
将亡值(eXpiring values)是那些即将被销毁的对象的表示,例如通过std::move操作产生的对象,它们可以从一个对象“移动”资源而不进行复制。
右值引用(rvalue reference,用&&表示)被引入来绑定到这些右值,允许高效地转移资源而不是复制,这是C++11引入的移动语义的一部分。
总结:

左值可以看作是具有名字的、持久的存储位置,可以对其进行读写操作。
右值则是临时的、通常不可寻址的值,用于提供数据给操作或初始化其他对象,C++11以后通过右值引用机制增强了对这些临时对象的处理能力,提高了程序的效率。

57. 写出一个可以作为左值的函数?

如果返回值具有引用的情况就可以作为左值
int & max(int  &x,int &) ; 就可以作为左值.

58.下面的函数实现在一个固定的数上加上一个数,有什么错误,改正 :

int add_n(int n)
{ static int i=100;i+=n;return i;}
其中:static是静态变量,生命周期程序的结束,所以i的值并不是一直都是100,可能和之前的状态有关系.

59.以下三条输出语句分别输出什么?

char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
cout << boolalpha << ( str1str2 ) << endl;
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; // 输出什么?
cout << boolalpha << ( str3str4 ) << endl; // 输出什么?
cout << boolalpha << ( str5
str6 ) << endl; // 输出什么?

首先需要知道c++中对于字符串等于的含义?比较首地址的位置.
第一条,不同的数组的首地址的位置是不一样的.
第二条,常变量也是数组,地址也是不一样的.
第三条.两个指针都指向的是常数,所以地址是一样的.

60.以下代码有什么问题?

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

?:三目运算符需要格式一致,所以会有错误,如果不一致会被强制转换成第一种的类型.

posted on 2018-08-05 20:59  风流倜傥的小花生  阅读(258)  评论(0编辑  收藏  举报