ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] 51. 请你谈谈你在类中如何使用const的 ``` 1.const成员:表示该成员变量为只读 2.const修饰形式参数:表示改函数不能修改外部传递进来的值 3.修饰函数: 表示该函数无法修改对象的数据成员 4.修饰函数返回值:表示该函数的返回值不能为左值。 ``` 52. 写出判断ABCD四个表达式的是否正确,若正确,写出经过表达式中a的值。 int a = 4; A a+= (a++); B a += (++a); C (a++) += a; D (++a) += (a++); 【参考答案】C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a; 改后答案依次为9,10,10,11。 53. 如何使用return语句 return 返回的可以是 值、地址、引用 1)return语句不可返回指向“栈内存“的“指针“或者“引用“,因为该内存在函数体结束时被自动销毁。 2)要搞清楚返回的究竟是“值“、“指针“还是“引用“。 3)如果函数返回值是一个对象,要考虑return语句的效率。 53。三元表达式后的两个参数必须为统一类型的值 54. 写一个函数计算当参数为n(n很大)时的值1-2+3-4+5-6+7...+n。 ``` long fn(long n) { if(n <= 0) { printf("error:n must > 0"); exit(1); } if (0 == n % 2) return (n/2)* (-1); else return (1-n/2) + n; } ``` 55.写一个能做左值的函数(方法有很多)。如: max(x, y) + = 2874 + 55; drwline(x, y) ++; ``` 左值:有空间,并且有写权限。函数返回引用 int &max(int &x, int&y) { return x> y? x:y; } int x = 55, y = 77; max(x, y) += 12 + 11;// 此时y = 92; count << "x=" << x << "; y=" << y << endl; //输出x=55;y=92; ``` 56. 一下代码中的输出语句输出为0吗,为什么? ``` struct CLS{ int m_i; CLS(int i):m_i(i) {} CLS() { CLS(0); } }; CLS obj; cout << obj.m_i <<endl; ``` 不能。在默认构造函数内部显示调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而**不会执行其后的初始化表达式**。**只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。** 57.不使用 "if" "? :" “switch“求两个数之间的最大值 ``` (a+b + | a - b|) /2 ``` 58. 当用一个已存在的对象去初始化对象时,会触发拷贝构造函数。 59. 在C++的一个类中声明一个static成员变量有没有用? 意味着它为该类的所有实例所共享,也就是说当某个类的实例修改类该静态成员变量,也就是说不管创建多少对象,static修饰的变量只占有一块内存。其修改值为该类的其他所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。static是加类访问空置的全局变量,不被继承。 60. C++中为什么使用模版类(类型)。(类模版 是一种泛型机制) 1)可以用来创建动态增长和减少的数据结构 2)它是类型无关的,因此具有很高的可复用性。 3)它在编译时而不是运行时肩擦好数据类型,保证来类型安全。 4)它是平台无关的,可移植性 5)可用于基本数据类型 61. C++中哪些函数不能被声明为虚函数? 普通函数、构造函数、内联函数、静态成员函数、友元函数。 1)虚函数用于基类和派生类,普通函数不能。 2)构造函数不能是因为虚函数采用的是虚调用的方法,允许在只知道部分信息的情况工作机制,特别允许调用只知道接口而不知道对象的准确类型方法,但是调用构造函数即使要创建一个对象,那势必要知道对象的准确类型。 3)内联成员函数的实质是在调用的地方直接将代码扩展开 4)继承时,静态成员函数是不能被继承的,它只属于一个类,因为也不存在动态联遍等。 5)友元函数不是类的成员函数,因此也不能被继承 62. return string(s1 + s2); 和 string temp(s1 + s2); return temp;一样么? 1)这是临时对象的语法,表示“创建一个临时对象并返回它。 2)将发生三件事。首先temp对象被创建,同时完成初始化;然后拷贝构造函数把temp拷贝到保存返回值的外部存储单元中;最后,temp在函数结束时被销毁(调用析构函数)。然而“创建一个临时对象并返回它“的过程是不同的,编译器直接把临时对象创建并初始化在外部存储单元中,省去类拷贝和析构的花费,提高了效率。 63. 介绍一下STL,详细说明STL如何实现vector STL(标准模版库,Standard Template Library,它由容器算法迭代器组成。 STL有以下的一些优点: 可以方便容易地实现搜索数据或对数据排序等一系列的算法; 调试程序时更加安全和方便; 即使是人们用STL在unix平台下写的代码你也可以很容易地理解(因为STL是跨平台的)。 vector实质上就是一个动态数组,会根据数据的增加,动态的增加数组空间。 64. 下面的throw表达式哪些是错误的? ``` a)class exceptionType{}; throw exceptionType{}; b) enum mathErr{overflow, underflow, zeroDivide}; throw zeroDivide(); a)class exceptionType{}; throw exceptionTyp(); b) enum mathErr{overflow, underflow, zeroDivide}; throw zeroDivide; 异常必须事先定义。 可以是简单的数据/值/对象。 ``` 65. 以下代码能够通过编译么,为什么 ``` unsigned int const size1 = 2; char str1[size1]; unsigned int temp = 0; cin >> temp; unsigned int const size2 = temp; char str2[size2]; ``` str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。 66. 输入一个字符串,将其逆序后输出 ``` void main() { char a[50] ; memset(a,0, sizeof(a)); int i =0; j; char t; cin.getline(a, 50, '\n'); int la = strlen(a) -1; int lm = strlen(a)/2; for (i=0, j=la; i < lm; i++, j--) { t = a[i]; a[i]= a[j]; a[j] = t; } cout << a <<endl; } 第二种: string str("cvicses"); string s(str.rbegin(),str.rend()); cout << s <<endl; return 0; ``` 67. 编写一个算法frequency, 统计在一个输入字符串中各个不同字符出现的频度。用适当的测试数据来验证这个算法。 ``` #include <vector> #include <iostream> #include <string> #include <map> using namespace std; int main() {     map<char,int> m_Count;     string str;     cout<<"请输入字符串!!"<<endl;     getline(cin,str);     for (size_t i = 0;i < str.size();++i)     {         m_Count[str[i]]++;     }     map<char,int>::iterator iter;     for (iter = m_Count.begin(); iter != m_Count.end();++iter)     {         cout<<iter->first<<":"<<iter->second<<endl;     }     return 0; } ``` 68.已知A[n]为整数数组,试着写出实现下列运算的递归算法: 1)求数组A中的最大整数。 2)求n个整数的和。 3)求n个整数的平均值。 ![Screen Shot 2020-06-07 at 17.51.58.png](https://img04.sogoucdn.com/app/a/100520146/7b5e6a67a4431c97344bb318d5e4a420) 69. 已知f为单链表的表头指针,链表中存储的都是整形数据,试写出下列运算的递归算法: 1) 求链表中的最大整数。 2)求链表的节点个数。 3)求所有整数的平均值。