您的位置:首页 > 职场人生

面试宝典学习笔记---10月11日

2010-10-11 22:03 253 查看
/*
一个5位数字ABCDE*4 = EDCBA,这5个数字不重复,请编程求出这个5位数字
思想:针对每一个i即(ABCDE)求出对应的j(EDCBA),然后判断i*4与j是否相等,相等既满足条件
*/
int main()
{
for (int i=10000; i<100000; i++)
{
int j = 0;
int t = i;
while (t != 0)
{
j = j*10 + t%10;
t = t/10;
}
if ((i<<2) == j)
{
cout<<i<<endl;
break;
}
}
}


2、mutable的用法

/*
在const成员函数中,用mutable修饰成员变量后,就可以修改类的成员变量了。
*/
class C
{
public:
C(int c):m_c(c){}
int c_add() const
{
return ++m_c;
}
int c_dec() const
{
return --m_c;
}
private:
mutable int m_c;
};
int main()
{
C c(10);
cout<<c.c_add()<<endl;
cout<<c.c_dec()<<endl;
}


3、字节对齐问题‘

/*
(1)、结构体的长度一定是最长的数据元素的整数倍。
(2)、数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍。
(3)、在VC中,可以使用pack预处理指令来禁止对齐调整。
(4)、字节对齐是在编译器决定的,一旦决定就不会改变,在运行时不会改变。
(5)、静态变量是存放在全局数据区域的,而sizeof计算栈中分配的大小,所以static变量不会被计算在内。
(6)、c++在处理数据的时候经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。
*/
class A1
{
public:
int a;
static int b;
A1(){}
~A1(){}
};

class A2
{
public:
double a;
float b;
int c;
char d;
A2(){}
~A2(){}
};
int main()
{
struct A
{
short a;
short b;
short c;
};
cout<<sizeof(A)<<endl;//sizeof(A)=6

cout<<sizeof(A1)<<endl;//sizeof(A1)=4因为static是存放在全局数据区域的,而sizeof计算栈中分配的大小,所以static变量不会被计算在内。
cout<<sizeof(A2)<<endl;//sizeof(A2)=24因为sizeof(double)=8,所以为了数据对齐,是按8个字节对齐的.(结构体的长度一定是最长的数据元素的整数倍)

string *p = new string[2];
cout<<sizeof(p)<<endl;//sizeof(p)=4
cout<<sizeof(string)<<endl;//sizeof(string)=32
}


4、 sizeof运算符作用在继承上

/*
空类所占的空间为1个字节,单一继承的空类的空间也为1个字节,
多重继承空类的空间也为1个字节,但是虚继承涉及虚表(虚函数指针),
所以sizeof(C)=4
*/
class A
{};
class B : public A
{};
class C : public virtual A
{};
int main()
{
cout<<"sizeof(A)="<<sizeof(A)<<endl;//sizeof(A)=1
cout<<"sizeof(B)="<<sizeof(B)<<endl;//sizeof(B)=1
cout<<"sizeof(C)="<<sizeof(C)<<endl;//虚继承涉及虚表(虚函数指针)sizeof(C)=4
}


5、const常量赋值的时候,必须同时初始化。像const int a;这样是错误的。

6、char *str和char str[]的区别

/*
char *str和char str[]的区别
*/
char str[] = "wangyang";是分配一个局部数组
char *pstr = "wangyang";是分配一个全局数组

局部数组是局部变量,它对应的是内存中的栈。
全局数组是全局变量,它对应的是内存中的全局区域。
全局区域的值是不能修改的,如*pstr='c';是错误的。pstr占用一个存储区域。

局部数据区域的数据是可以修改的,str[0]='c';是正确的,str不占用存储区域的。

下面这个函数有问题
char *strA()
{
char str[] = "wangyang";//分配一个局部数组
return str;//返回的是局部变量的地址,这个局部变量在函数调用完后就释放了,所以返回的结果是不安全的。
}

可以改为
const char *strA()
{
char *str = "wangyang";//分配一个全局数组
return str;
}

还可以该为
const char *strA()
{
static char str[] = "wangyang";//static开辟一段静态存储空间
return str;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: