001:static的定义和用法
A:static的定义:它是C++中很常见的修饰符、它被用来控制变量的存储方式和可见性。static被引入以告知编译器,将变量存储在静态存储区而不是栈上空间,static它会把变量的可见范围限制在编译单元中,使它成为一个内部链接,它的反义词为extern。
B:static的用法:静态成员是静态存储的,必须对其进行初始化。在类中定义静态成员可以实现多个对象之间的数据共享。在函数体内定义静态变量,此变量只能在这个函数内使用。在函数体外,模块内定义静态变量,此变量只能在模块体内被使用。
002:const的定义和用法
A:const的定义:const常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。因此,定义或说明常类型时必须进行初始化。
B:const的用法:在 c程序中,const的用法主要有定义常量、修饰函数参数、修饰函数返回值等3个用处。在c++程序中,它还可以修饰函数的定义体,定义类中某个成员为常态函数,即不改变类中的数据成员。被const修改的东西都要受到强制保护,可以预防意外的变动,能提高程序的健壮性。
003:inline的定义和用法
A:inline的定义:是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。C++中引入它的主要原因是用它替代C中表达式形式的宏定义。
B:inline的用法:一般用于两种情况1)一个函数不断被重复调用2)函数只有简单的几行,且函数内不包含for、while、switch。关键字inline必须与函数定义体放在一起才能使用函数成为内联,仅将inline放在函数声明前面不起任何作用。
004:请简述深拷贝和浅拷贝的定义:
如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。
005:如果程序在运行中因内存错误而崩溃,有哪几种可能的原因:
A:内存泄漏 B:内存越界访问 C:野指针 D:访问空指针 E:引用未初始化的变量 F:不清楚的指针运算 G:结构图成员顺序发生变化 H:结构体大小变化
I:分配释放不配对 J:返回指向临时变量的指针 K:试图修改常量 L:误解传值和传引用 M:重名符合 N:栈溢出 O:字节顺序 P:多线程共享变量没有用valotile修饰
006:面向对象和面向过程的定义:
A:面向对象:软件开发的方法,是一种对现实世界理解和抽象的方法,是计算机编程发展到一定阶段的产物。面向对象=对象+类+继承+通信,如果一个系统使用这个4个概念设计和实现,则我们称该系统为面向对象。
B:面向过程:是一种以过程为中心的编程思想,这些都是以什么正在发生为目标进行编程,不用于面向对象是谁在受影响。
C:面向对象的作用:维护简单、可扩充性、代码重用
007:面向对象的三大特性:封装性、继承性、多态性
A:封装性:
B:继承性
C:多态性:简单的说就是“一个接口,多种方法”,即允许将子类类型的指针赋值给父类类型的指针。多态性一般都是通过虚函数、抽象类、覆盖、模板来实现。
008:用递归算法判断数组a[n]是否为一个递增数组
bool charge(int p[],int n)
{
if(n==1)
return true;
else
{
if(p[n-1]>p[n-2])
{
return charge(p,n-1);
}
else
return false;
}
}
009:局域网一般由三部分组成:网络服务器、工作站、通信设备
010:IP地址一般由:网络号和主机地址
011:引用的定义和作为函数参数传递的作用:
A:引用就是一个变量的别名,对引用的操作和对变量操作完全一样。
B:引用作为函数参数传递,能够保证参数传递过程中不产生副本,提供传递效率,且通过const的使用,保证传递的安全性
012:函数strcmp和函数strcpy的区别:
int strcmp(char* src,char* dst) :比较两个字符串是否相等,当src==dst返回0,当src<dst返回负数,当src>dst返回正数
char* strcpy(char*src,char*dst):字符串拷贝函数
013:写一个简单的函数,将一个十六进制字符串转化为数字(大小不超过整形)
#include<iostream>
using namespace std;
long int hex2int(const char * srcStr) {
char * dst;
if (srcStr[0] == '0'&&srcStr[1] == 'x') {
return strtol(srcStr, &dst, 0);
}
else
{
return strtol(srcStr, &dst, 16);
}
}
int main() {
char *myHex = "0x11";
char *myHex2 = "11";
cout << hex2int(myHex)<<endl;
cout << hex2int(myHex2);
}
输出为:17 17
0014:写个函数判断整数是否是对称数
int is_duichen(int data)
{
int tmp, new_data;
tmp = data;
new_data = 0;
while(tmp)
{
new_data = new_data*10 + tmp/10;
tmp = tmp/10;
}
if(new_data == data)
{
printf("%d is duichen \n", data);
return 0;
}
else
{
printf("%d is NOT duichen \n", data);
return -1;
}
}
015:圆圈上顺时针排列着1,2,3……n这n个数,从1开始,顺时针隔一个拿走一个(1最先被拿走,下一个是3被拿走),问最后剩下是哪一个数?
分析:约瑟夫环的问题
n=1:1
n=2:2
n=3:2
n=4:4
n=5:2
n=6:4
n=7:6
n=8:8
n=9:2
n=……
发现当n=(2^k)+1,K>0,的时候,最后剩下的都是2.
假如:(2^k)+1<n<(2^(k+1)+1),要剩下(2^k)+1个数,就需要先去掉n-((2^k)+1)个数,
按题意,每两个数擦掉一个数,所以擦掉n-((2^k)+1)个数,需要擦掉的数是:2*(n-((2^k)+1)),
所以下一个起始的就是2*(n-((2^k)+1))+1
,所以剩下的就是2*(n-((2^k)+1))+1+1;代码实现如下:
#include<iostream>
#include <math.h>
using namespace std;
int yuesefu(int num[],int n,int k) {
if(n==1){
return 1;
}else if(n==2){
return 2;
}else if(n>2)
{
return 2 *(n -(pow(2,k)+1)) + 1+1 ;
}
}
int main() {
int num[12] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
//因为 2^4-1+1<12<2^4+1,所以k=3
cout<<yuesefu(num,12,3);
}
016:怎么定义动态数组:
int len;
cin >> len;
//用指针p指向new动态分配的长度为len*sizeof(int)的内存空间
int *p = new int[len];