- 浏览: 132009 次
- 性别:
- 来自: 天津
最新评论
文章列表
#include <iostream>
#include <cstdio>
using namespace std;
class A
{
public:
char ach[3];
virtual void test() { };
};
class B : public A
{
public:
char bch[3];
virtual void btest() { };
};
class C : public A
{
char cch[3];
...
普通文件(regular file):就是一般我们存取的文件,由ls -al显示出来的属性中,第一个属性为 [-],例如 [-rwxrwxrwx]。另外,依照文件的内容,又大致可以分为:
• 纯文本文件(ASCII):这是Unix系统中最多的一种文件类型,之所以称为纯文本文件,是因为内容为我们可以直接读到的数据,例如数字、字母等等。设置文件几乎都属于这种文件类型。举例来说,使用命令“cat ~/.bashrc”就可以看到该文件的内容(cat是将文件内容读出来)。
• 二进制文件(binary):我们在GNU发展史中提过,系统其实仅认识且可以执行二进制文件(binary file)。L ...
#include <iostream>
using namespace std;
class A
{
public:
void print() { cout << "hello" << endl; }
int a;
};
int main()
{
A a;
A *pa = &a;
delete pa;
return 0;
}
会产生运行时错误。
15 :
15 = 15 00000000000000000000000000001111
15<<4 = 240 00000000000000000000000011110000
15>>4 = 0 00000000000000000000000000000000
-15 :
-15 = -15 11111111111111111111111111110001
-15<<4 = -240 111111111111111111111 ...
#include <iostream>
#include <sstream>
using namespace std;
template<class T>
struct tbtnode
{
T s_t;
bool lflag;
bool rflag;
tbtnode *lchild;
tbtnode *rchild;
};
template<class T>
tbtnode<T>* createtbt(tbtnode<T>* tbt, int k, ostream& out ...
#include <iostream>
using namespace std;
int checkCPUendian()
{
union
{
unsigned int a;
unsigned char b;
} c;
c.a = 1;
return (c.b == 1);
}
int main()
{
// 输出为1,表示 little-endian
// 如果输出为0,则表示 big-endian
cout << checkCPUendian() << endl;
return 0;
...
#include <iostream>
using namespace std;
int global = 10; // 全局/静态变量区,与常量区很近
int main()
{
// a, b, c 三个变量都是存放在栈中
// 但是指向的位置则不同
const char *a = "hello"; // 常量区,不允许修改
char b[] = "hello"; // 栈
char *c = new char[10]; // 堆
cout << hex << ...
问题:
说有一批编号为1~100的灯,每个灯下面都有一个开关,按一下就开,再按一下就关,一开始灯都是灭的。然后有个数学乘法的初学者为了联系100以内的乘法,决定:
1. 凡是编号为1的倍数的,按一次开关
2. 凡是编号为2的倍数的,再按一次开关
3. 凡是编号为3的倍数的,再按一次开关
4. ....
5. 凡是编号为100的倍数的,再按一次开关
问:最后哪些灯还亮着?
解答:
编号为平方数的灯是亮着的。
问题:
话说有一国王找到100个囚犯,每个人都剃了光头。
国王对他们说:一会儿有人会在你们头上写上1-100之间的随机数。你们只要有一个人能说对大家头上所有数字的和,就都放了。否则统统赠送给芙蓉姐姐做宠物。给你们一炷香的时间好好商量一下对策。
这帮子囚犯都是学过基本算数的,加减乘除都没问题。
一炷香之后,国王的巫师屏蔽了他们之间的交流(不要问我怎么做到的) - 结果每个囚犯都能看到别人头上写的啥,但没办法知道自己的数字。
囚犯们采用什么策略才能保证一定会被释放呢?
解答:
设100个囚犯头上数字的和为sum;第N个囚 ...
任何一个有经验的程序员都知道,软件开发遵循着一些不成文的法则。然而,如果你不遵循这些法则也并不意味着会受到惩罚;相反,有时你还会获得意外的好处。下面的就是软件编程中的21条法则:
任何程序一旦部署即显陈旧。
修改需求规范来适应程序比反过来做更容易。
一个程序如果很有用,那它注定要被改掉。
一个程序如果没用,那它一定会有很好的文档。
任何程序里都仅仅只有10%的代码会被执行到。
软件会一直膨胀到耗尽所有资源为止。
任何一个有点价值的程序里都会有至少一个bug。
原型完美的程度跟审视的人数成反比,反比值会随着涉及的资金数增大。
软件直到被变成产品运行至少6个月后,它最严重 ...
补码的补码是原码:
设原码为a,a的补码为b,b的补码为c
则b = ~a + 1;
c = ~b + 1 = ~(~a + 1) + 1 = a + ~(1) + 1 = a
补码的计算方法:
正数的补码是其本身;
负数的补码是原码按位取反,末尾加1,符号位不变。即从最低位开始,到第一个1,各位不变,符号位不变,其他各位取反。
补码的性质:
1. 两数之和的补码等于各数补码之和。
2. 两数之差的补码等于被减数的补码与减数相反数的补码。
3. 原码的补码的补 ...
定义虚函数的限制:
(1)非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。实际上,优秀的程序员常常把基类的析构函数定义为虚函数。因为,将基类的析构函数定义为虚函数后,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。
(2)只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。
(3)当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数自动成为虚函数。
(4)如果 ...
一种允许你做一些 C++ 不直接支持的事情的用法。
你可能通过虚函数 virtual clone()(对于拷贝构造函数)或虚函数 virtual create()(对于默认构造函数),得到虚构造函数产生的效果。
class Shape {
public:
virtual ~Shape() { } // 虚析构函数
virtual void draw() = 0; // 纯虚函数
virtual void move() = 0;
// ...
virtual Shape* clone() c ...
一 在C中分为这几个存储区
1.栈 由编译器自动分配释放;
2.堆 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收;
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后释放;
4.另外还有一个专门放常量的地方。程序结束后释放。
...
1 栈中的变量,其内存地址是从高地址到低地址进行分配的:
int i=1;
int j=1;
cout<<&i<<endl<<&j<<endl; //输出:0012FF60(高地址处) 0012FF54(低地址处)
int * pi = new int(10);
float * pf = new float(1.1);
cout<<pi<<endl<<pf<<endl; // 输出:0x602010(低地址) 0x602030(高地址),指针指向的位置是在堆里,所以地址从低 ...