C++拷贝构造函数和赋值运算符有那些不同和相同点。
拷贝构造函数和赋值号的异同
同:都可以对对象的成员进行赋值
异:拷贝构造函数首先是一个构造函数,它调用的时候产生一个对象,是通过参数传进来的那个对象来初始化产生的对象。赋值是把一个对象赋值给一个原有的对象,而且还要检查一下两个对象是不是同一个对象,如果是的话就不做任何操作。
1. 使用C++赋值运算符应注意什么地方?
如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率。而有些场合只能用“值传递”而不能用“引用传递”,否则会出错。
对于赋值函数,应当用“引用传递”的方式返回String对象。如果用“值传递”的方式,虽然功能仍然正确,但由于return语句要把 *this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。
对于相加函数,应当用“值传递”的方式返回String对象。如果改用“引用传递”,那么函数返回值是一个指向局部对象temp的“引用”。由于temp在函数结束时被自动销毁,将导致返回的“引用”无效
12..函数前的static和volatile变量中关键字的作用
(3)static :常见的两种用途: 1>统计函数被调用的次数; 2>减少局部数组建立和赋值的开销. 1>、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。
8、32位系统中,出现结构字节对齐的问题和大小端的问题的避免?
指定对齐值:#pragma pack (value)时指定的对齐value
9.写一个函数判断系统是大端还是小端。若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1.
大端格式:在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中
小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节
联合体union的存放顺序是所有成员都从低地址开始存放。
Int checkCPU ()
{
Union w
{
Int a;
Char b;
}c;
c.a=1;
return (c.b==1);
比较哈希表和平衡二叉树的特点,它们分别如用那些场合。
哈希表:哈希表查找速度比较快,可以时间复杂度为O(1)的情况下找到实现查找。但是要耗比较多的内存。所以比较适用于对查找速度要求比较高、且内存空间足够的时候
平衡二叉树:如果想在以后用二分法查找的时候查找速度比较快的话用建立平衡二叉树的方法()平衡二叉树支持动态的插入和查找,保证操作在O(height)时间,这就是完成了哈希表不便完成的工作,动态性。平衡二叉树/红黑树就是为了将查找的时间复杂度保证在O(logN)范围内。所以如果输入结合确定,所需要的仅仅是查询,则可以考虑使用哈希表,如果输入集合不确定,则考虑使用平衡二叉树/红黑树,保证达到最大效率。
6用C/C++编程,从1到100中取出10个不同的数,要求打印出所有可能的组合;
#include <iostream.h>
int source[100];
int dest[10]={0};
int index_source=0;
int index_dest=0;
int k=10;
int i=0;
int j=0;
void composition(int source[], int index_source, int dest[], int index_dest, int k)
{
if(100-index_source==k)
{
for(i=0; i<index_dest; i++)
{
cout<<dest<<" ";
}
for(i=index_source; i<100; i++)
{
cout<<source<<" ";
}
cout<<endl;
return;
}
if(index_source<100 && k==1)
{
for(i=index_source; i<100; i++)
{
for(j=0; j<index_dest; j++)
{
cout<<dest[j]<<" ";
}
cout<<source<<endl;
}
return;
}
composition(source, index_source+1, dest, index_dest, k);
dest[index_dest++]=source[index_source];
composition(source, index_source+1, dest, index_dest, k-1);
}
void main()
{
for(int i=0;i<100;i++)
source=i;
composition(source,0, dest, 0, 10);
}
如果系统堆栈很小,不能处理超过4级的函数调用,如何解决八皇后问题
:#include <iostream>
#include <math.h>
#include <malloc.h>
using namespace std;
int *position; //放置的位置
int queen; //皇后数目
int count; //第N种可能性//判断第n行是否放置皇后
bool SignPoint(int n)
{
for (int i=0;i<n;i++)
{
if (*(position+i) == *(position+n)) //该列已经放置过皇后了
return false;
if (abs(*(position+i) - *(position+n)) == n-i) //对角线已经放置过了
return false;
}
return true;
}//设置皇后
void SetQueen(int n=0)
{
if (queen==n)
{
//该处可以改成自己想要的显示方式
printf("NO.%d: ",++count);
printf("/n");
for (int i=0;i<queen;i++)
{
for (int j=0;j<queen;j++)
{
if (j == position[i])
{
printf("* ");
}
else
{
printf("0 ");
}
}
printf("/n");
}
printf("/n");
return;
}
else
{
for (int i=0;i<queen;i++)
{
position[n] = i; if(SignPoint(n))//如果该位置放置皇后正确的话,则到下一行
{
SetQueen(n+1);
}
}
}
}int _tmain(int argc, _TCHAR* argv[])
{
cout<<"请输入皇后的总数:"<<endl;
cin>>queen;
position = (int*)malloc(sizeof(int));
SetQueen();
cout<<"摆放完毕"<<endl;
cin.get();
cin.get();
return 0;
}
三,编程与逻辑题
1自己写一个strstr
(单链表判断有无环,)
char* strstr(char* buf, char* sub)
{
char* bp;
char* sp;
If(!*sub)
return buf;
while(*buf)
{bf=buf;
sp=sub;
do{ if(!*sp)
return buf;
}
while(*bp++==*sp++)
buf+=1;
}
return 0;
}