使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。子进程与父进程的区别在于:1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)2、各自的进程ID和父进程ID不同3、子进程的未决告警被清除;4、子进程的未决信号集设置为空集。
2、
class String
{
public:
String(const char *str = NULL); // 通用构造函数
String(const String &another); // 拷贝构造函数
~String(); // 析构函数
String& operater =(const String &rhs); // 赋值函数
private:
char* m_data; // 用于保存字符串
};
String::String(const char* str)
{
if ( str == NULL ) // strlen在参数为NULL时会抛异常才会有这步判断
{
m_data =new char[1] ;
m_data[0] ='\0' ;
}
else
{
m_data =new char[strlen(str) +1];
strcpy(m_data,str);
}
}
String::String(const String &another)
{
m_data =new char[strlen(another.m_data) +1];
strcpy(m_data,another.m_data);
}
String& String::operator=(const String &rhs)
{
if ( this==&rhs)
return*this ;
delete []m_data; //删除原来的数据,新开一块内存
m_data =new char[strlen(rhs.m_data) +1];
strcpy(m_data,rhs.m_data);
return*this ;
}
String::~String()
{
delete []m_data ;
}
3、公有继承
4、下面这个程序执行后会有什么错误或者效果:
1
2
3
4
5
6
7
|
#define MAX
255
int
main()
{
unsigned
char
A[MAX], i;
for
(i =
0
; i <= MAX; i++)
A[i] = i;
}
|
MAX=255
数组A的下标范围为:0..MAX-1,这是其一..
其二.当i循环到255时,循环内执行:
A[255]=255;
这句本身没有问题..但是返回for (i=0;i<=MAX;i++)语句时,
由于unsigned char的取值范围在(0..255),i++以后i又为0了..无限循环下去.
5、void类型没有分配内存,而引用必须是另一个固定内存变量的别名,所以不能指向void
1
2
3
4
5
6
7
8
9
10
11
|
#include<stdio.h>
void
main()
{
short
*p,*q;
short
arr[15]={0};
p=q=arr;
p++;
printf
(
"%d,"
,p-q);
printf
(
"%d,"
,(
char
*)p-(
char
*)q);
printf
(
"%d"
,
sizeof
(arr)/
sizeof
(*arr));
}
|
inta[5]={1,2,3,4,5};
int*ptr=(int*)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
数组名的值是一个指针常量,也就是数组第一个元素的地址。*(a+1)等同于a[1],*(a+1)=2。
1
2
3
|
#define A(x) x+x
int
i=5*A(4)*A(6);
cout<<i;
|
BOOL : if ( !a ) or if(a)
int : if ( a == 0)
float : const EXPRESSION EXP = 0.000001
if ( a < EXP && a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)
1
2
3
4
5
|
char
*p1;int64 *p2;
p1=(
char
*)
0x800000
;
p2=(int64 *)
0x800000
;
char
*a=p1+
2
int64_t *b=p2+
2
|
所以a=0x800000+0x2=0x800002
a=0x800000+0x10=0x800010
11、以下代码中,A 的构造函数和析构函数分别执行了几次:
A*pa=new A[10];
delete []pa;
10char a=12
int a=12.0
int a=12.0f
int a=(int)12.0
1.子类向基类的向上转型(Up Cast)
2.基类向子类的向下转型(Down Cast)
其中向上转型不需要借助任何特殊的方法,只需用将子类的指针或引用赋给基类的指针或引用即可,dynamic_cast向上转型其总是肯定成功的。
注意:dynamic_cast在将父类cast到子类时,父类必须要有虚函数。因为dynamic_cast运行时需要检查RTTI信息。只有带虚函数的类运行时才会检查RTTI。
16、
int f() { int *a = new int(3); return *a; }内存泄露,没有delete
int *f() { int a[3] = {1, 2, 3}; return a; }数组是临时的,根本传不到主调函数里
17、
1
2
3
4
5
|
char
*p, *q;
p = (
char
*)malloc(sizeof(
char
) *
20
);
q = p;
scanf(“%s %s”, p, q);
printf(“%s %s\n”, p, q);
|
1
2
|
char
s1[]=
"12345"
,*s2=
"1234"
;
printf(
"%d\n"
,strlen(strcpy(s1,s2)));
|
1. 字符串最后以 ’ \0 ’ 结束。strcpy将'1234\0'复制到目的地址
2. strlen()遇到 ’ \0 ’ 停止
20、
以下关于STL的描述中,____是错的。
正确答案: C
STL容器是线程不安全的
当容量不够时,vector内部内存扩展方式是翻倍
std::sort是稳定排序
std::bitset不是一个STL容器
std::stack默认是用deque实现的
std::string中可以存储多个’\0’字符
deque:同上,O(1)
map:双向迭代器,不过由于是关联容器,需要通过key访问alue的方法,O(h),h为树的高度
unordered_map:前向迭代器,同上,平摊复杂度O(1),最差O(n),也与散列函数的好坏有关。
string:同vector
1
|
time_t t;
|
1
2
3
4
5
|
struct
Node
{
int
size;
char
data[0];
//编译器会认为这就是一个长度为0的数组,而且会支持对于数组data的越界访问 };
|
1
2
3
4
5
6
7
|
#include<iosteam.h>
void
main(){
int
n[][3] = {10,20,30,40,50,60};
int
(*p)[3];
p=n;
cout<<p[0][0]<<
","
<<*(p[0]+1)<<(*p)[2]<<endl;
}
p[0]表示第一行的地址,p[0]+1表示第一行首地址偏移一个地址,即a[0][1]。
int (*p)[3],p是一个数组指针,指向三个元素为一个数组的指针,(*p)表示第一行,(*p)[2]表示a[0][2]
26、int fseek(FILE *stream, long offset, int fromwhere);函数设置文件指针stream的位置。 如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。 如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置,函数返回一个非0值。 实验得出,超出文件末尾位置,还是返回0。往回偏移超出首位置,返回-1,且指向一个-1的位置,请小心使用。 fseek函数和lseek函数类似,但lseek返回的是一个off_t数值,而fseek返回的是一个整型。 27、
test变量的定义可以初始化,初始值的类型必须是union中第一个成员的类型。
28、
如果一个类中声明了纯虚函数,其派生类中没有对该函数定义,那该函数在派生类中仍为纯虚函数,凡是包含纯虚函数的类都是抽象类。
通常重载函数调用的依据是函数名、参数类型、参数个数。 类的静态成员是属于类的而不是属于哪个对象的,
因此可以说是所有对象所共有的。内联函数是在编译时将目标代码插入的
|