??xml version="1.0" encoding="utf-8" standalone="yes"?> 本文主要讲解Qt是如何实现反,以及一点点反射使用的小心得?/p>
Qt反射内幕窥 详细内容 反射前期准备 得到注册的类成员变量 得到注册的类成员函数 讉KcL员属性(get,setQ?/p>
调用注册的函?/p>
反射应用 ȝ Qt反射机制是基于moc(meta object compiler)实现?在这里多插一句(可以说Qt所有C++没有的特性,几乎都和q个有关p)。但是需要注意的是Qt提供的反式基本的反,不支持类的反,q个与JavaQC#q是有差别的?/p>
通常C++的编译过Eؓ 预处?>~译->链接->q行 Qt~译的过E中Q有一个moc的过E?在Qt工程构徏q程中的qmake其实是q这个事的。moc->预处?>~译->链接->q行?/p>
在mocq程中,需要处理的事情如下Q?/p>
1?识别一些特D的宏Q_OBJECT、Q_PROPERTY、Q_INVOKABLE。。? 如果到q些关键字,Qt自然׃ȝ成对应的moc文g?/p>
2?slotQsignal自然也是如此?/p>
3?uidesignerQ同样也是在q个阶段处理? 1?首先得承于Q_Object,同时需要在class中加入Q_OBJECTQ但是Q_Object的构造函数默认是U有的不让ѝ? 在类中直接用Q_GADGET也可以实现反,。。。据说只能实现部分功能,目前我只实现到能遍历成员属性,函数Q但是不能访问其中的倹{? q个q程其实是定义QMetaObject的过E,具体见Qt源码 2?注册cL员变量需要用Q_PROPERTY Q_PROPERTY( type member READ get WRITE set) 其中READ,WRITE是关键字 Type表示成员的类型(不支持自定义cdQ对Qt很多基本cd都支持); Member代表你给该成员另外v的名字,可以和变量名不同QgetQset是自己在C++函数里面定义的基本的讉K函数名,不需要写参数。直接上代码Q? 3?注册cL员函? 如果你希望这个函数能够被反射Q那么很单,只需要在cȝ函数声明前加入Q_INVOKABLE关键字? 例如Q_INVOKABLE int func( QString flag ); 主要思\是得到其元对象Q得到其元属性,然后p得到你需要的信息Q具体的讉K函数有name,type,需要注意的是得到的type是枚丑ր|q在Qt提供了typeToName的函敎ͼ你可以得到想要的Q例如不是空z的2Q而是”int”Q?/p>
和遍历类属性一_其实是Ҏ(gu)元对象,得到元函? 其中typeName代表q回cdQsignature只的是函数的原貌QmethodType代表函数的类型,在Qt中分Zc(槽,信号Q普通函敎ͼ?/p>
在这里用的是QObject的property() 和setPropertyҎ(gu)Q来讉K成员信息。但是对于用Q_GADGET宏的c,是不能用这个方法的Q还在寻找解x法,基本思\当然是重写?/p>
调用注册的函?/strong>
//普通函数的调用 在MyClass中,我们定义了int func( QString flag );q个函数Q利用反的调用方式如上Q主要是理解invokeMethod的用法,其中Qt::DirectConnection是函数的执行方式Q分为(异步和同步)QQ_RETURN_ARG是返回参敎ͼQ_ARG是传入参敎ͼ需要按函数声明中参数的序依次传入QQt最多支?个参敎ͼ对于一般的应用没有问题。还有疑问,L步具见Qt强大的帮助文档?/p>
反射反射Q就我目前的认知水^来看Q通过使用字符Ԍ来实现函数的通用化调用,例如你可以利用反把很多函数攄到数l中Q实Cơ遍历,全部调用?/p>
目前我见到的大多是利用反来操作数据库,例如hibernateQ其实可以利用Qt的反,快速实现所谓的hibernate,(最q自q立实C一套,很方??/p>
q篇文章主要讲了如何使用Qt来实现反,在实用角度上来讲Q我们不需要了解Qt是怎么实现反射的,对于怎么用上面说的很清楚了。大家有什么的新的xQ希望能提出来,来电(sh)请咨?br />
<levard@gmail.com>
文章概览
Qt反射内幕窥
moc讲解
详细内容
反射前期准备
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(int Member1 READ Member1 WRITE setMember1 )
Q_PROPERTY(int Member2 READ Member2 WRITE setMember2 )
Q_PROPERTY(QString MEMBER3 READ Member3 WRITE setMember3 )
public:
explicit MyClass(QObject *parent = 0);
signals:
public slots:
public:
Q_INVOKABLE int Member1();
Q_INVOKABLE int Member2();
Q_INVOKABLE QString Member3();
Q_INVOKABLE void setMember1( int mem1 );
Q_INVOKABLE void setMember2( int mem2 );
Q_INVOKABLE void setMember3( const QString& mem3 );
Q_INVOKABLE int func( QString flag );
private:
int m_member1;
int m_member2;
QString m_member3;
};
得到注册的类成员变量
MyClass theObj;
const QMetaObject* metaObj = theObj.metaObject();
//1.遍历cȝ属?/span>
int propertyCnt = metaObj->propertyCount();
for ( int i = 0; i < propertyCnt; ++ i )
{
QMetaProperty oneProperty = metaObj->property( i );
cout << " name: " << oneProperty.name();
cout << " type: " << QVariant::typeToName( oneProperty.type()) << "\n";
}
得到注册的类成员函数
//2.遍历cȝ函数成员
int methodCnt = metaObj->methodCount();
for ( int idx = 0; idx < methodCnt; ++ idx )
{
QMetaMethod oneMethod = metaObj->method( idx );
cout << "--------begin-------" << "\n";
cout << " typeName: " << oneMethod.typeName() << "\n";
cout << " signature: " << oneMethod.signature() << "\n";
cout << " methodType: " << oneMethod.methodType() << "\n";
cout << "--------end---------" << "\n";
}
讉KcL员属性(get,setQ?/strong>
//3.使用反射
cout << "-------test property-----------" << "\n";
MyClass newObj;
newObj.setProperty("Member1", 66);
cout << newObj.property( "Member1" ).toString().toStdString() << "\n";
cout << newObj.Member1() << "\n";
cout << "--------end----------" << "\n";
int ret;
MyClass newObj;
newObj.setMember1( 20 );
newObj.setMember2( 50 );
QMetaObject::invokeMethod( &newObj, "func", Qt::DirectConnection,
Q_RETURN_ARG(int, ret ),
Q_ARG(QString, "+"));
反射的应?/strong>
ȝ
]]>
貌似好久没有自己写过blog了,对于自己q样一个健忘的人,文采又这么差的h来说Q正好借这个机会锻g下自q文字能力Q同时记录下学过的东ѝ?/p>
貌似用过C++也好久了Q碰到这个问题,开始确实感觉到无力Q最后还是搜索了下别人是怎么做的。据说是Adobe 07q的面试题?/p>
1、第一x大家都是Q既然不能被l承Q也是一旦承这个类之后Q类׃能被初始化?/p>
2、可能把cȝ构造函数私有化Q和单例有点像,但是q样cd不能正常使用了?/p>
3、实在无力,查了下,他们是通过使用虚承解册个问题的?/p>
对于虚承,具体资料见:http://blog.163.com/xiangzaihui@126/blog/static/166955749201182294317243/
里面有一句话很重要:C++规定:把真正创建对象时所指定的类UCؓ是最zc?虚基cd对象是由最zcȝ构造函数通过调用虚基cȝ构造函数进行初始化?
具体实现代码如下Q?/p>
1: #include <cstdio>
2: #include <iostream>
3:
4: template<class T> class CFinal{
5: friend T;
6: private:
7: CFinal(){ std::cout << "CFinal()" << std::endl; }
8: ~CFinal(){}
9: };
10:
11: class CFoo : virtual public CFinal<CFoo>{
12: public:
13: CFoo(){ std::cout << "CFoo()" << std::endl; }
14: ~CFoo(){}
15: };
16:
17: class CBar : public CFoo{
18: public:
19: CBar() { std::cout << "CBar" << std::endl; }
20: };
21:
22: int main()
23: {
24: //CBar bar;
25: CFoo foo;
26: while(1){}
27: return 0;
28: }
当你创徏CBarӞ需要初始化CFinalQ但是你不是他的friendQ不能初始化Q上面标U)
如果你会问不要virtual行不行?
不行Q由于不要virtualQ你可以l过CFoo的friend讉K到CFinalQ但是有virtual׃同了Q你必须直接初始化CFinalQ这是C++的规定,避免多次初始化)
但是有个问题Qgcc不能~译通过Q在friend T出错Qvs2010没有问题Q希望知道的能给点帮助?/p>
参考文献:
http://blog.163.com/xiangzaihui@126/blog/static/166955749201182295845689/QC++实现不能被承的c)
http://blog.sina.com.cn/s/blog_5e6fd4290100nhxa.html
http://www.shnenglu.com/richardhe/archive/2008/03.html
http://www.cnitblog.com/linghuye/archive/2007/06/24/29007.html
3D游戏资料 http://www.shnenglu.com/flyindark/archive/2011/05/01/145475.aspx
OGRE http://blog.sina.com.cn/s/articlelist_1159765812_1_1.html
http://www.shnenglu.com/lovedday/ 3D知识
http://www.shnenglu.com/lai3d/
http://www.shnenglu.com/billhsu/
|络~程
http://www.shnenglu.com/Solstice/archive/2011/04/17/144378.html
原网址Q?a title="http://topic.csdn.net/u/20110816/19/3194c61c-fc4d-41ad-8357-9110d8cdc6b0.html" >http://topic.csdn.net/u/20110816/19/3194c61c-fc4d-41ad-8357-9110d8cdc6b0.html
下面是我的解{,以及我搜集的解答Q以及我的解{?
需要声明的是没有考虑溢出的情况,对于a-b溢出的问题,都{?4位的Q?
#include <cstdio>
#include <assert.h>
int Min(int x, int y)
{
int tmp = (x - y) * (((x - y) >> (sizeof(int) * 8 - 1)) | 1);
return ((x + y) - tmp) / 2;
}
int Min2(int x, int y)
{
int min[2] = {y, x};
int sign = ((x - y) >> (sizeof(int) * 8 - 1)) & 1;
return min[sign];
}
int Min3(int a, int b)
{
int sum = a + b;
b = a - b;
a += b * (b >> (sizeof(int) * 8 - 1));
return sum - a;
}
int Min4(int a, int b)
{
int sign = ((unsigned int)(a - b)) >>31;
return a * sign + b * (1 - sign);
}
int Min5(int a, int b)
{
return (&b)[(a-b)>>31];
}
int main()
{
int x, y;
// assert(Min3(0x80000000, 0x7fffffff) == 0x80000000);
while(scanf("%d%d", &x, &y) != EOF)
{
printf("the minimal is %d\n", Min5(x, y));
}
return 0;
}
q有大家是怎么~排代码的啊Q给我推荐个插g
有必要对Min5 介绍下,来自CSND
int min(int a, int b)
{
return (&b)[a-b>>31];
}
在windowspȝ上完?br />&b获得b在堆栈上的指针,a-b>>31的结果只能是-1或?
当a大于b?(a-b>>31) = 0, 此时函数q回(&b)[0] = b,
当a于b?(a-b>>31) = -1, 此时函数q回(&b)[-1]=aQ?br />Z?&b)[-1]会是aQ?br />函数在调用前会将参数压入堆栈Q?br />int m = min(55,33);
00E6142E push 21h -> b = 33
00E61430 push 37h -> a = 55
00E61432 call min (0E610F5h)
在调用min函数的时候,参数按从叛_左的序压入堆栈Q?nbsp;
堆栈是段q箋内存Q在windows下堆栈地址是从高到低,
也就是先pushq入的参C占用高内存地址Q?br />b先被pushQ所以b占用高内存地址Q?br />a被后push,a占用紧连着b的低内存地址Q?br />+ &b 0x0030fd80 int *
+ &a 0x0030fd7c int *
奇的是Q我们知?(&b)[0]q回的是b本n的|
?&b)[-1]q回的却是a 的|也就是说(&b)[-1]q回了上四个字节的|
(&b)[-1] = *(&b - 1) = a;Q这里b是int型,所?1相当于将地址向后偏移4个字节)
一双鞋Q耐克?癑֤Q李宁的4癑֤Q特步的3癑֤Q?61?癑֤Q所以,你毕业于一个什么样的大学很重要?/span>
一双鞋Q在地摊不过几十元,C商场、专卖店Q会涨到一癄臛_百。所以,你呆在什么地方很重要?/span>
一双鞋Q只有合脚ƈ且合意了才能卖出厅R所以,沟通了解很重要?/span>
一双鞋Q少了一只,是不值钱的。所以,另一半很重要?/span>
一双鞋Q样式老的Q大多很便宜。所以,更新自己的知识很重要?/span>
一双鞋Q积压多q_只能打折处理。所以,到合适的q婚吧?/span>
一双鞋Q?有h3?q如新的Q有ZCq穿烂的。所以,有个好上司很重要
q是个现实的C会Q感情不能当饭吃QI夫ȝ事哀。不要相信电(sh)影里的故事情节,那只是个供许多陌生h喧嚣情感的场所。只有不理智和不现实的h才相?/span>
l自己定目标Q一q_两年Q五q_也许你出生不如别人好Q通过努力Q往往可以改变70%的命q。破|子破摔只能和懦弱做朋友?/span>
1, 一个hQ如果你不D׃把,你根本不知道自己有多优秀?nbsp;
2?赚钱是一U能力,花钱是一U水qI能力可以l,水^是轻易练不出来的?/span>
3、年Mh不可以太狂?/span>
4、一个h的知识,通过学习可以得到Q一个h的成长,必须通过练?/span>
5、这个世界上好书很多Q可以改变命q的书很?/span>
6、这个世界上朋友很多Q可以用一生托付的朋友很少?/span>
7、如果发C个hQ一个地方,一件事Q一本书Q可以改变你的命q。一定要惛_法跟他发生关p,否则Q他p你没关系?/span>
8、当一个h没有成功的时候,装也装出成功的样子。(因ؓ装的时候,他已l成Z性格的一部分Q?/span>
9、我们学习的目的Q是Z使用Q不是知识没有用Q而是你没有用,说明你没有用?/span>
10、别人对你的态度Q决定了你的命运?
11、笑由心生?/span>
12、一个h出门的时候,口袋里都装的钱,装钱的目的,是Z花出去,那里舒服往那里花。一个h让别服,他就是一个经营者;别h让你舒服Q他是一个消费者?/span>
13、一个hQ敢听真话,需要勇气;一个h敢说真话Q需要魄力?
14、因Z的存在,让别人快乐v来,你叫朋友Q因Z的存在,让别人卓v来,你是教练Q因Z的存在,让别人强大v来,你是领导?/span>
15、一件事情,对你伤害的程度与事情本生没有M关系Q取决于你对qg事的态度?/span>
16 、你Q简单了Q你的世界就单了Q你Q简单了Q事情就单了?
17、一件事Q会q了Q好好干Q不会干了,乱干。干的次数多了,自然会干Q但是,首先Q你要干?/span>
18、一个hQ想要优UQ你必须要接受挑战;一个hQ你惌快优秀Q就要去L挑战?/span>
19、一个h惌创业Q先要学会打工?/span>
20、世界上Q成功的有两UhQ一Uh是傻子,一Uh是疯子。傻子是会吃亏的人,疯子是会行动的h?/span>
1?“太漂亮的女h最后L孤单一人,因ؓ她不肯向爱情妥协Q太帅气的男人最后L落在不太漂亮的女人手上,因為他向生活妥协。因此太漂亮的女人和太帅气的?人L无法长久一LQ因Z们都习惯被围l被取?zhn)。太漂亮的女人,是堪折的花,早遇到好Q太帅气的男人,是待熟的果,最好不要太早遇上?#8221;
2?#8220;时候,希望自己快点长大Q长大了Q却发现遗失了童q_单nӞ慕恋h的甜蜜,恋爱Ӟ怀念单w的自由。很多事物,没有得到时总觉得美好,得到之后才开始明白:“我们在得到的同时也在失去?#8221;
psQ有得有失,淡然面对
3?#8220;在爱的世界里Q没有谁对不赯Q只有谁不懂得珍惜谁?能够说出的委屈便不算委屈Q能够抢走的׃h便不爱人?不说出委屈就只能委屈自己Q不放走不爱你的人就得不到爱你的人?#8221;
psQ在泪的时候觉得委屈,其实心里已经慢慢学会坚强
4?“人生的\上,我们都在奔跑Q我们d赶超一些hQ也d被一些h越。h生的要义Q一是欣赏沿途的风景Q二是抵Nq的l点Qh生的U诀Q寻找一U最?合自q速度Q莫因疾q而不堪重P莫因q缓而空耗生命;人生的快乐,在于走自q路,看自q景,越他h不得意,他h越不失志?#8221;
psQ在l望Ӟ要抬头看看天Q想惛_在的意义
5?#8220;有一天,友情和爱情碰见。爱情问友情Q世上有我了Qؓ什么还要有你的存在Q友情笑着_爱情会让Z泪Q而友情的存在是帮h们擦q眼泪!”
psQ打心眼里重视朋友,哪怕不联系Q不多言Q其实也会很依赖
6?#8220;我很׃Q却不知道该如何靠近你,所以觉得离开也是可以的。ƈ没有什么不同,l果反正都是q样Q是好是坏都不重要,重要的是我曾l迷恋你Q就像我qh一把晚清的雕花椅?#8221;
psQ安妮的话L让h在感到温暖的同时有一丝心痛,爱是一门要耗费一生去学习、经营的学问
7?#8220;我想l你q福Q却Cq你的世界。我想用我的全世界来换取一张通往你的世界的入场券Q不q,那只不过是我的一厢情愿而已。我的世界,你不在乎Q你的世界,我被驱逐。我真的喜欢你,闭上|以ؓ我能忘记Q但下的泪Q却没有骗到自己?#8221;
psQ答应自己,要独自承受这一?
8?“不要让幸擦肩而过Q最懂你的hQL会一直在w边守护你,不让你有一丝的委屈Q真正爱你的人,也许不会说许多爱你的话,却会做许多爱你的事。如果发?w边有这L人,请你好好珍惜……q福不会时时{着你,׃的h和你qZ是随时可以出玎ͼ好好把握Q不要让自己和幸擦肩而过”
psQ期待懂我的?
9?#8220;人生最最不能逊色的风景应该是努力。努力是人生的一U精状态,是对生命的一U赤子之情。努力是拥有之母Q拥有是努力之子Q一心努力可谓条条大路通罗马。所以,与其规定自己一定要成ؓ一个什么样的h物,获得什么东西,不如练自己做一个努力的人?#8221;
psQ早p明白Q最的不是成功的那一刻,而是事后回想奋斗q程中的艰辛
10?#8220;人生Q没有永q的伤痛Q没有过不去的坎。还是让我们学学杨柳Q看似柔弱却坚韧Q狂风吹不断Q太刚强的树qԌ却在风中折枝。学会放弃,学会承受Q学会坚强,学会微笑Q那是一U别L丽Q适当的放弃,是h生优雅的转n?#8221;
psQ没有过不去的坎Q让自己跨越的姿势美一?
1、靠山山会倒,靠hZ跑,只有自己最可靠?br />
2、没有h陪你C辈子Q所以你要适应孤独Q没有h会帮你一辈子Q所以你要奋斗一生?br />
3、与其用泪水(zhn)恨今天Q不如用汗水拼搏今天?br />
4、当眼泪尽的时候,留下的应该是坚强?br />
5、h生就像一杯没有加p的咖啡Q喝h是苦涩的Q回呌v来却有久久不会退ȝ余香?br />
6、有一U缘Q放手后成ؓ风景Q有一颗心Q坚持中方现真诚?br />
7、选择自己所qQ爱自己所选择的?br />
8、这一U不攑ּQ下一U就会有希望?br />
9、曾l拥有的不要忘记Q难以得到的更要珍惜Q属于自q不要攑ּQ不属于自己的不要强求,已经失去的留作回忆?br />
10、喜Ƣ就该珍惜,珍惜别攑ּ?br />
11、h生就是一场旅行,不在乎目的地Q在乎的是沿途的风景以及看风景的心情?br />
12、不求与人相比,但求越自己Q要哭就哭出Ȁ动的泪水Q要W就W出成长的性格?br />
13、ؓ你的难过而快乐的是敌人,Z的快乐而快乐的是朋友,Z的难q而难q的才是你的知己?br />
14、如果爱Q请qQ如不爱Q请d?br />
15。只要心中有希望存在Q就有幸存在?br />
W一?#8220;人都是逼出来的”。每个h都是有潜能的Q生于安乐,M忧?zhn)Q所以,当面对压力的时候,不要焦燥Q也许这只是生活对你的一点小考验Q相信自己,一切都能处理好Q逼急了好汉可以上梁山,时世造英雄,I则思变Qh只有压力才会有动力?br />
W二句:“如果你简单,q个世界对你简?#8221;。简单生zL能幸生z,知怹Q宽容大度,什么事情都不能想繁杂,心灵的负荷重了,׃怨天忧h。要定期的对记忆q行一ơ删除,把不愉快的h和事从记忆中摈弃?br />
W三句:“人生没有彩排Q每一天都是现场直?#8221;。偶会惻I如果人生真如一场电(sh)子游戏,玩坏了可以选择重来Q生zM变成什么样子?正因为时光流逝一M复返Q每一天都不可q回Q所以更要珍惜每一寸光_孝敬父母、疼爱孩子、体贴爱人、善待朋友?br />
W四句:“怀才就象怀孕,旉久了才会让h看出?#8221;。hQ切莫自以ؓ是,地球d了谁都会转,古往今来Q恃才放肆的人都没有好下场。所以,即便再能qԌ也一定要保持谦虚谨慎Q做好自q事情Q是金子M发光?br />
W五句:“q去酒逢知已千杯少Q现在酒逢千杯知已少”。不甚酒力,体会不了酒的味Q但却能感受知已的妙处。没有朋友的人生是孤独的Q不完整的,可是Q?因ؓ生活的忙,渐渐了联络Q友谊就变的淡了Q所以,抽点旉Q联l朋友一赯聊天Q让情谊在笑C升腾Q当朋友遇到了难题的时候,一定要记得n?出,即便帮不了忙Q安C是最大的支持?br />
W六句:“人生如果错了方向Q停止就是进?#8221;。hQL很难Ҏ(gu)自己的缺点,人,也L 很难发现自己的错误。有Ӟ明知错了Q却ƲŞ不能Q一错再错,把握正确的方向,坚守自己的原则,世界上的诱惑很多Q天上永q不会掉馅饼Q不要因图一?的快乐而付出惨痛的代h(hun)Q如果发现错了,一定要止步?br />
W七句:“人生两大(zhn)剧Q一是万念俱灎ͼ一是踌w满?#8221;。现代的人好象特?脆弱Q报U怸天天报道众多名h得抑郁症Q这些h一定是从一个极端走向别一个极端。正因ؓt躇满志Q才坚信自已是完的Q是无所不能的,如果受到一Ҏ(gu)折, ׃变得极度自卑Q甚臛_ȝl生zȝ勇气。ؓ自己找一个准的定位Qn受生zM吧?br />
W八句:“人生和爱情一P错过了爱情就错过了h?#8221;。爱情是什么?让h无所适从Q让人神颠倒,面对爱情的时候,勇敢一点,大胆说出自己的爱Q有花堪摘直LQ莫待无q折枝。hQM生老病死,怎么q都是一生,错过了爱情就错过了生命的_ֽ?br />
W九(ji)句:“天下有钱人终成眷?#8221;。现代社会的人变得越来越势利Q爱情也来无重,于是我不得不怿“天下有钱人终成眷?#8221;是对C爱情的最切的描q?br />
W十句:“要成功,需要朋友,要取得巨大的成功Q需要敌?#8221;。有竞争才有发展Q因为有了敌人的存在Q因为有了不服输的决心,才会努力地做好自q事。所以,有时候,敌h比朋友的力量更大Q天下没有永q的敌hQ却有永q的朋友Q有些时候,敌h也可以变成朋友?
1.也许愈是丽愈是脆弱,像盛夏的沫?/span>
2. “如果׃可以让你q福Q那么我q你;如果不爱你可以让你幸,那么我就只是喜欢你?#8221;
“?#8212;—你的q福呢?”
“我的q福Q就是看着你幸?#8221;
3. 如果一开始,你就不要出现在我的面前,那么Q我也许׃会知道幸的滋味。你何其D忍Q把所 有的爱满满地那么卒不及防地都l了我,告诉我,你永q喜Ƣ我 爱我Q永q不会离开我,让我错以 为,我可以幸得象个被宠溺的孩子Q让我错以ؓQ只要抱住你Q就可以拥有整个世界?/span>
4.“你会喜欢我多久?”
“永远?#8221;
“即你已l不爱我了,即你已l忘记我了,即你已l从q个世界消失。我依然会爱着你?#8221;
“pQ都不在q个世界上了Q还怎么爱我Q?#8221;
“我会L一个天使,让它替我来爱你?#8221;
5.如果失去了你的爱Q我在这世界上,p失去了灵的I壳Q再也找不到家?/span>
6.当你在我w边快乐Ӟq福在我w边Q当我听CW声Ӟq福已经在我w边?
7. 习惯了Y弱,心也会逐渐软弱hQ习惯了依赖Q会渐渐忘记如何依靠自己。一旦眼泪失L力, 一旦陷入孤立无援的境地Q如果变得Y׃Q该怎样M护n边的亲h和自己?
8.我很想你Q却不想见你?
9.如果一开始你没有告诉我,你永q喜Ƣ我Q永q不会离开我,只要׃你,可以拥有整个世界?
10.那一q_是谁三天三夜不眠不休U下满塘药Q是谁抱着14支粉U色的荷p他喜Ƣ我Q是谁说会 永远保护我、让我开心。难道,你一开始就是在骗我Q请你不要再来伤xQ我会难q,心像被撕 一栗如果你q喜Ƣ我Q请你珍惜我。如果你不喜Ƣ我Q我会离开你?/span>
12.不喜Ƣ又能怎样Q心里有数就可以了。不可能要求世上所有h都是你的朋友Q都是关׃的h。珍 惜对你好的hQ其他的Q就随她们去吧!
13.既然对世人宣布了我们的恋情,我们是一对了Q永不分手,不离不弃?
14.上天不会只永q眷一个hQ给她多大的q运Q日后必会给她多大的难。她能做到的只是把握住 q福的时机,凭借它努力地冲上最大可能的峰。所以,l不可以错过MZ?
15.如果你始l没办法׃我,我会l你分手的权利?
16.世界上没有什么h是可以真正相信的Q只有相信自己,因ؓ只有自己不会背叛自己Q欺骗自己,d自己?
17.我想要靠自己的力量立_q个世界Q有_的媄响力Q有_的钱Q可以守护我惛_护的人,可 以在面对MH如其来的灾难时Q都不会被打倒?
1.那个在不l意中,也许改变了我一生的男孩。我怿L一天,我们会在世界的屋再ơ相遇?
不要L用过L衡量生活的幸与不q,每个人的生命都是可以l放丽的,只要你珍惜?
——《木吉他的夏天?
2.没有人永q十七岁Q但永远有h十七岁?
因ؓ依赖一份只有我记得的回忆,我已l长大。长到可以勇敢的面对人间所有的风风雨雨?
——《来不及学坏?
3.我一直喜Ƣ下午的阛_。它让我怿q个世界M事情都会有{机,怿命运的宽厚和好?
我们l归要长大,带着一U无怨的心情(zhn)?zhn)地长大?
归根到底Q成长是一U幸?
——《按旉大?
4.喜欢的歌静静地听Q喜Ƣ的q地看?
——《我要我们在一赗?/span>
5.其实Qh字的l构是怺的支撑,只要你愿意,谁都可以l谁q福Q?
——《我要我们在一赗?
6.我知道无论我走到哪里Q你都会陪在我n辏V陪我哭Q陪我笑Q陪我等待,陪我开花?
——《女生派?
7.爱情像糖?我囫囵吞?享受瞬间的甜?
Q-《糖衣?
8.最痛的痛是原谅Q最黑的黑是背叛
Q-《糖衣-临暗?
9.我们都是单翅膀的天使,只有拥抱着才能飞翔?
——《挥着膀的女孩?
10.我们生活在同一个温暖的水域Q也许偶会被水草缠l,但因为彼此温暖的呼吸Q相信都不会是死 l。如果我说我׃Q我一直都׃Q不知道你会不会怿Q?/span>
——《双D?
11.成长是q样Q痛q快乐着。你得接受这个世界带l你的所有伤宻I然后无所谓惧的长大?
——《双D?/span>
12.爱是一场战?我不怕受伤只怕你不快?
——《离׃个ID的距R?
13.是别q头?你就感觉不到我的深情?
——《离׃个ID的距R?
14.爱情是一场注定的潮水Q而自己就是一叉时等待靠岸的舟。潮来潮去,随L逐流Q蝲沉蝲, 在劫N?
——《离׃个ID的距R?
15.在爱情这场戏里L有一个主角和一个配角,累的永远是主角,伤的永远是配角?
——《爱在仙境的日子?
16.像流水一栗金钱,CQ美丽,q有爱情Q最后都会像水一栗?
——《爱在仙境的日子?
17.我一路狂奔,渴望在拥挤匆忙的人群里找C个和我相似的面孔Q她和我有相似的命运。我可以在 她的w上看到自己命运的参照,何去何从Q不再那么仓皇?
——《小妖的金色城堡?/span>
18.我没有月亮?
q个月亮是很多h的,但不是我的。温暖遥不可及?
——《校服的裙摆?
19.我们是q样苍老的Q从时光的一端辗转到时光的另一端,请别说再见,不需要再见?
——《校服的裙摆?
20.甜言蜜语Q说l左耛_?
——《左耟?
21.我没有勇气折断我的翅膀Q却也飞不到M地方?
——《左耟?
22.我们的爱情染上了埃 {待一场风暴的z礼
——《左耟?
23.有些人,有些?是不是你惛_?q的能忘记?
——《左耟?
24.最痛苦的是Q消׃的东西,它就永远的不见了Q永q都不会再回来,却偏q要留下一根细而尖的针Q一直插在你心头Q一直拔不去Q它惌你疼Q你得?
——《左耟?
你永q也看不见我最׃的时候,因ؓ我只有在看不见你的时候,才最׃。同P你永q也看不见我最寂寞的时候,因ؓ我只有在你看不见我的时候,我才最寂寞?
要理想不要惻I要激情不要矫情。凡事知_?/span>
今天有个人问我,怎么自动生成一个文件头Q其实我早就想了Q就是太懒了Q同事发现Visual assist是可以办到的Q上|一搜发现这个功能真是很强大?/p>
很多自动生成QFor example 写个win32E序Q开始的那些操作大概得100多行吧,现在告诉你只要几个字母就能搞定了Q太牛g?/p>
那我q门弄斧了Q大牛别拍我?/p>
W一步:C可以修改snippet的地Ҏ(gu)
点击[Edit]Q?q入~辑?
W二步:
在这?你会发现很多~写Q如果用q的化,现在知道它藏那了把,在这里可以根据自q讄来进行添?/p>
注意要写ShortcutQ这个羃写才能v作用?/p>
下面l个win32自动生成的例子吧?/p>
首先Q?/p>
在Shortcut中填写win_creatorQ点击运用就好了Q然后OK?/p>
在代码中Q写win_creatorQ后选中下面那个蓝色Q回车就生成了?/p>
昄下生成的代码Q写得还很简z啊Q:
至于其他q用之类的,大家可以参考:
http://www.shnenglu.com/yeduwu/articles/97785.htmlQ?q个有很多关于代码注释的内容?/p>
大家有啥更好用法或者东西,希望大家分n下啊?/p>
最q学院组l了一个实训,要求是利用Socket通信和D3D的知识, 写一个多人在U的游戏Q?服务端是在linux下, 客户是在Windows下; 写这个的目的是想让大家给我找? Ƣ迎大家的意见。我的QQ ?43167101Q希望和大家一赯论?/p>
服务端(linux下)Q?/p>
服务端用的是非dSelect模型Q下面是目的结构图Q?
׃其中有很多的消息Q其ơؓ了扩展,所以用了工厂模式Q我把从客户端接受的消息都放在输入缓冲区中, 向客L发送的消息都放在输出缓冲区中, Z对玩家进行管?/p>
设计了一个Manager(单例)来管理玩Ӟ主要是ؓ了实现删除,dQ获取等操作Q?所以就用了STL中Mapq个容器。值得一提的是InputSocketStream是用的一U@环队列的?/p>
惌计的?/p>
客户端:
客户端由于是在windows中,所以用了Windows的socket通信Q同时用了多线E,其中一个线E主要是Z接受玩家的数据,ȝE主要是Z负责逻辑和渲染?/p>
渲染层的l构Q?/p>
CUI端,目前做的比较单就是用CEGUIq个重量U的界面库,发现不是那么好用Q太庞大了?/p>
通信端:Q主要是负责和服务器的通信Q,包括玩家和虚拟玩家的消息
想用的需要被指CEGUI 0.7.1
客户端的代码,Q?׃资源文g太大了就不上传了
目前q存在的问题是虚拟玩家的同步问题,不知到有高手懂这个问题的吗,提供个思\.
我的思\是这LQ比如玩家按下W键,向服务器发送这个消息,服务器负责{发给其他的客LQ该客户端开始走动,知道玩家抬vW键后发送停止的消息l服务器Q服务器负责转发。但是在实现q个问题的时候,׃我用了DiretInputQ但是响应Keydown事gӞ按下W键时QKeydown执行了很多次Q没有找C个办法知道keydownq个事g什么时候停止的。谁有好的做法希望能告诉我?
下面发个游戏的截图:
1.求下面函数的q回|微YQ?br>
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
假定x = 9999?{案Q?
思\Q将x转化?q制Q看含有?的个数?br>
2. 什么是“引用”Q申明和使用“引用”要注意哪些问题?
{:引用是某个目标变量?span style="COLOR: #0000ff">“别名”(alias)Q?/span>?span style="COLOR: #0000ff">应用的操作与对变量直接操作效果完全相?/span>?span style="COLOR: #0000ff">x一个引用的时候,切记要对其进行初始化。引用声明完毕后Q相当于目标变量名有两个名称Q即该目标原名称和引用名Q?strong>不能再把该引用名作ؓ其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本w不是一U数据类型,因此引用本n不占存储单元Q系l也不给引用分配存储单元。不能徏立数l的引用?br>
3. ?#8220;引用”作ؓ函数参数有哪些特点?
Q?Q?span style="COLOR: #ff0000">传递引用给函数与传递指针的效果是一L。这Ӟ被调函数的Ş参就成ؓ原来主调函数中的实参变量或对象的一个别名来使用Q所以在被调函数中对形参变量的操作就是对其相应的目标对象Q在主调函数中)的操?/span>?br>
Q?Q?span style="COLOR: #ff0000">引用传递函数的参数Q在内存中ƈ没有产生实参的副?/span>Q它是直接对实参操作Q而?span style="COLOR: #ff0000">一般变量传递函数的参数Q当发生函数调用Ӟ需要给形参分配存储单元QŞ参变量是实参变量的副本;如果传递的是对象,q将调用拯构造函?/span>。因此,当参C递的数据较大Ӟ?strong>引用比用一般变量传递参数的效率和所占空间都?/span>?br>
Q?Q用指针作为函数的参数虽然也能辑ֈ与用引用的效果Q但是,?strong>被调函数中同栯lŞ参分配存储单元,且需要重复?*指针变量?的Ş式进行运,q很Ҏ(gu)产生错误且程序的阅读性较?/strong>Q另一斚wQ在主调函数的调用点处,必须用变量的地址作ؓ实参。而引用更Ҏ(gu)使用Q更清晰?br>
4. 在什么时候需要?#8220;常引?#8221;Q?/strong>
如果既要利用引用提高E序的效率,又要保护传递给函数的数据不在函C被改变,应使用常引用。常引用声明方式Qconst cd标识W?&引用?目标变量名;
?
int a ;
const int &ra=a;
ra=1; //错误
a=1; //正确
?
string foo( );
void bar(string & s);
那么下面的表辑ּ是非法的:
bar(foo( ));
bar("hello world");
原因在于foo( )?hello world"串都会生一个时对象,而在C++中,q些临时对象都是constcd的。因此上面的表达式就是试囑ְ一个constcd的对象{换ؓ非constcdQ这是非法的?br>
引用型参数应该在能被定义为const的情况下Q尽量定义ؓconst ?br>
5. ?#8220;引用”作ؓ函数q回值类型的格式、好处和需要遵守的规则?
格式Q类型标识符 &函数名(形参列表及类型说明){ //函数?}
好处Q在内存中不产生被返回值的副本Q(注意Q正是因点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!
注意事项Q?br>
Q?Q不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用成Z"无所?的引用,E序会进入未知状态?br>
Q?Q不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这U情况(q回函数内部new分配内存的引用)Q又面其它?yu)尬局面。例如,被函数返回的引用只是作ؓ一个时变量出玎ͼ而没有被赋予一个实际的变量Q那么这个引用所指向的空_由new分配Q就无法释放Q造成memory leak?br>
Q?Q可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某U业务规则(business ruleQ相兌的时候,其赋值常怸某些其它属性或者对象的状态有养I因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针)Q那么对该属性的单纯赋值就会破坏业务规则的完整性?br>
Q?Q流操作W重载返回值申明ؓ“引用”的作用:
操作符<<?gt;>Q这两个操作W常常希望被q箋使用Q例如:cout << "hello" << endl; 因此q两个操作符的返回值应该是一个仍然支持这两个操作W的引用。可选的其它Ҏ(gu)包括Q返回一个流对象和返回一个流对象指针。但是对于返回一个流对象Q程序必重斎ͼ拯Q构造一个新的流对象Q也是_q箋的两?lt;<操作W实际上是针对不同对象的Q这无法让h接受。对于返回一个流指针则不能连l?lt;<操作W。因此,q回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许q就是C++语言中引入引用这个概늚原因吧。赋值操作符=。这个操作符象流操作W一P是可以连l用的Q例如:x = j = 10;或?x=10)=100;赋值操作符的返回值必L一个左|以便可以被l赋倹{因此引用成了这个操作符的惟一q回值选择?br>
?
Qi nclude <iostream.h>
int &put(int n);
int vals[10];
int error=-1;
void main()
{
put(0)=10; //以put(0)函数g为左|{h(hun)于vals[0]=10;
put(9)=20; //以put(9)函数g为左|{h(hun)于vals[9]=20;
cout<<vals[0];
cout<<vals[9];
}
int &put(int n)
{
if (n>=0 && n<=9 ) return vals[n];
else { cout<<"subscript error"; return error; }
}
Q?Q在另外的一些操作符中,却千万不能返回引用:+-*/ 四则q算W。它们不能返回引用,Effective C++[1]的Item23详细的讨Zq个问题。主要原因是q四个操作符没有side effectQ因此,它们必须构造一个对象作回|可选的Ҏ(gu)包括Q返回一个对象、返回一个局部变量的引用Q返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作ؓq回值的三个规则Q第2?两个Ҏ(gu)都被否决了。静态对象的引用又因?(a+b) == (c+d))会永qؓtrue而导致错误。所以可选的只剩下返回一个对象了?br>
6. “引用”与多态的关系Q?/span>
引用是除指针外另一个可以生多态效果的手段。这意味着Q一个基cȝ引用可以指向它的zcd例?br>
?
Class A; Class B : Class A{...}; B b; A& ref = b;
7. “引用”与指针的区别是什么?
指针通过某个指针变量指向一个对象后Q对它所指向的变量间接操作?/span>E序中用指针,E序的可L差Q而引用本w就是目标变量的别名Q对引用的操作就是对目标变量的操作?/strong>此外Q就是上面提到的对函Cref和pointer的区别?br>
8. 什么时候需?#8220;引用”Q?/strong>
操作符<<?gt;>赋值操作符=的返回倹{拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用?br>
以上 2-8 参考:http://blog.csdn.net/wfwd/archive/2006/05/30/763551.aspx
9. l构与联合有和区别?
1. l构和联合都是由多个不同的数据类型成员组? ?/font>在Q何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址I间Q? 而结构的所有成员都存在Q不同成员的存放地址不同Q?
2. 对于联合的不同成员赋? 会对其它成员重? 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的?br>
10. 下面关于“联合”的题目的输出Q?br>
a)
Qinclude <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
{案Q?66 (低位低地址Q高位高地址Q内存占用情冉|Ox010AQ?br>
b)
main()
{
union{ /*定义一个联?/
int i;
struct{ /*在联合中定义一个结?/
char first;
char second;
}half;
}number;
number.i=0x4241; /*联合成员赋?/
printf("%c%c\n", number.half.first, mumber.half.second);
number.half.first='a'; /*联合中结构成员赋?/
number.half.second='b';
printf("%x\n", number.i);
getch();
}
{案Q?AB (0x41对应'A',是低位;Ox42对应'B',是高位)
6261 (number.i和number.halfq一块地址I间Q?/font>
11. 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字W串QstrSrc 是源字符丌Ӏ不调用C++/C 的字W串库函敎ͼL写函?strcpy?br>
{案Q?br>char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
return strDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) != ‘\0’)
return tempptr ;
}
12. 已知Stringcd义如下:
class String
{
public:
String(const char *str = NULL); // 通用构造函?br>String(const String &another); // 拯构造函?br>~ String(); // 析构函数
String & operater =(const String &rhs); // 赋值函?br>private:
char *m_data; // 用于保存字符?br>};
试写出cȝ成员函数实现?br>
{案Q?br>
String::String(const char *str)
{
if ( str == NULL ) //strlen在参CؓNULL时会抛异常才会有q步判断
{
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,other.m_data);
}
String& String::operator =(const String &rhs)
{
if ( this == &rhs)
return *this ;
delete []m_data; //删除原来的数据,新开一块内?br>m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data,rhs.m_data);
return *this ;
}
String::~String()
{
delete []m_data ;
}
13. .h头文件中的ifndef/define/endif 的作用?
{:防止该头文g被重复引用?br>
14. Qi nclude<file.h> ?Qi nclude "file.h"的区别?
{:前者是从Standard Library的\径寻扑֒引用file.hQ?strong>后者是从当前工作\径搜dƈ引用file.h?br>
15.在C++ E序中调用被C ~译器编译后的函敎ͼZ么要加extern “C”Q?/strong>
首先Q作为extern是C/C++语言中表明函数和全局变量作用范围Q可见性)的关键字Q该关键字告诉编译器Q其声明的函数和变量可以在本模块或其它模块中使用?br>
通常Q在模块的头文g中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块BƲ引用该模块A中定义的全局变量和函数时只需包含模块A的头文g卛_。这P模块B中调用模块A中的函数Ӟ在编译阶D,模块B虽然找不到该函数Q但是ƈ不会报错Q它会在q接阶段中从模块A~译生成的目标代码中扑ֈ此函?br>
extern "C"是连接申?linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式~译和连接的,来看看C++中对cMC的函数是怎样~译的:
作ؓ一U面向对象的语言QC++支持函数重蝲Q而过E式语言C则不支持。函数被C++~译后在W号库中的名字与C语言的不同。例如,假设某个函数的原型ؓQ?br>
void foo( int x, int y );
该函数被C~译器编译后在符号库中的名字为_fooQ而C++~译器则会生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机Ӟ生成的新名字UCؓ“mangled name”Q?br>
_foo_int_int q样的名字包含了函数名、函数参数数量及cd信息QC++是靠这U机制来实现函数重蝲的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )~译生成的符h不相同的Q后者ؓ_foo_int_float?br>
同样圎ͼC++中的变量除支持局部变量外Q还支持cL员变量和全局变量。用h~写E序的类成员变量可能与全局变量同名Q我们以"."来区分。而本质上Q编译器在进行编译时Q与函数的处理相|也ؓcM的变量取了一个独一无二的名字,q个名字与用L序中同名的全局变量名字不同?br>
未加extern "C"声明时的q接方式
假设在C++中,模块A的头文g如下Q?br>
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif
在模块B中引用该函数Q?br>
// 模块B实现文g moduleB.cpp
Qi nclude "moduleA.h"
foo(2,3);
实际上,在连接阶D,q接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_intq样的符P
加extern "C"声明后的~译和连接方?br>
加extern "C"声明后,模块A的头文g变ؓQ?br>
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif
在模块B的实现文件中仍然调用foo( 2,3 )Q其l果是:
Q?Q模块A~译生成foo的目标代码时Q没有对其名字进行特D处理,采用了C语言的方式;
Q?Q连接器在ؓ模块B的目标代码寻找foo(2,3)调用ӞL的是未经修改的符号名_foo?br>
如果在模块A中函数声明了foo为extern "C"cdQ而模块B中包含的是extern int foo( int x, int y ) Q则模块B找不到模块A中的函数Q反之亦然?br>
所以,可以用一句话概括extern “C”q个声明的真实目的(M语言中的M语法Ҏ(gu)的诞生都不是随意而ؓ的,来源于真实世界的需求驱动。我们在思考问题时Q不能只停留在这个语a是怎么做的Q还要问一问它Z么要q么做,动机是什么,q样我们可以更深入地理解许多问题Q:实现C++与C及其它语a的合编E。
明白了C++中extern "C"的设立动机,我们下面来具体分析extern "C"通常的用技巧:
extern "C"的惯用法
Q?Q在C++中引用C语言中的函数和变量,在包含C语言头文Ӟ假设为cExample.hQ时Q需q行下列处理Q?br>
extern "C"
{
Qi nclude "cExample.h"
}
而在C语言的头文g中,对其外部函数只能指定为externcdQC语言中不支持extern "C"声明Q在.c文g中包含了extern "C"时会出现~译语法错误?br>
C++引用C函数例子工程中包含的三个文g的源代码如下Q?br>
/* c语言头文ӞcExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c语言实现文gQcExample.c */
Qi nclude "cExample.h"
int add( int x, int y )
{
return x + y;
}
// c++实现文gQ调用addQcppFile.cpp
extern "C"
{
Qi nclude "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}
如果C++调用一个C语言~写?DLLӞ当包?DLL的头文g或声明接口函数时Q应加extern "C" { }?br>
Q?Q在C中引用C++语言中的函数和变量时QC++的头文g需dextern "C"Q但是在C语言中不能直接引用声明了extern "C"的该头文Ӟ应该仅将C文g中将C++中定义的extern "C"函数声明为externcd?br>
C引用C++函数例子工程中包含的三个文g的源代码如下Q?br>
//C++头文?cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++实现文g cppExample.cpp
Qi nclude "cppExample.h"
int add( int x, int y )
{
return x + y;
}
/* C实现文g cFile.c
/* q样会编译出错:Qi nclude "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}
15题目的解{请参考《C++中extern “C”含义深层探烦》注解:
16. 兌、聚?Aggregation)以及l合(Composition)的区别?
涉及到UML中的一些概念:兌是表CZ个类的一般性联p?/strong>Q比?#8220;学生”?#8220;老师”是一U关联关p;聚合表示has-a的关p,是一U相Ҏ(gu)散的关系Q聚合类不需要对被聚合类负责Q如下图所C,用空的菱形表C合关p:
从实现的角度Ԍ聚合可以表示?
class A {...} class B { A* a; .....}
?strong>l合表示contains-a的关p,兌性强于聚合:l合cM被组合类有相同的生命周期Q组合类要对被组合类负责Q采用实心的菱Ş表示l合关系Q?br>
实现的Ş式是:
class A{...} class B{ A a; ...}
参考文章:http://blog.csdn.net/wfwd/archive/2006/05/30/763753.aspx
http://blog.csdn.net/wfwd/archive/2006/05/30/763760.aspx
17.面向对象的三个基本特征,q简单叙qCQ?br>
1. 装Q将客观事物抽象成类Q每个类对自w的数据和方法实行protection(private, protected,public)
2. l承Q广义的l承有三U实现Ş式:
实现l承Q指使用基类的属性和Ҏ(gu)而无需额外~码的能力)?/font>
可视l承Q子H体使用父窗体的外观和实C码)?/font>
接口l承Q仅使用属性和Ҏ(gu)Q实现滞后到子类实现Q?/font>
前两U(cȝ承)和后一U(对象l合=>接口l承以及U虚函数Q构成了功能复用的两U方式?br>
3. 多态:是将父对象设|成为和一个或更多的他的子对象相等的技术,赋g后,父对象就可以Ҏ(gu)当前赋值给它的子对象的Ҏ(gu)以不同的方式运作。简单的_是一句话Q?strong>允许子cȝ型的指针赋值给父类cd的指?/span>?br>
18. 重蝲Qoverload)和重?overriedQ有的书也叫?#8220;覆盖”Q的区别Q?br>
常考的题目。从定义上来_
重蝲Q是指允许存在多个同名函敎ͼ而这些函数的参数表不同(或许参数个数不同Q或许参数类型不同,或许两者都不同Q?br>
重写Q是?strong>子类重新定义复类虚函?/strong>的方法?br>
?span style="COLOR: #ff0000">实现原理上来?/strong>Q?br>
重蝲Q?strong>~译器根据函C同的参数表,对同名函数的名称做修饎ͼ然后q些同名函数成了不同的函数Q?span style="COLOR: #ff0000">臛_对于~译器来说是q样?/span>Q?/strong>如,有两个同名函敎ͼfunction func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这LQint_func、str_func。对于这两个函数的调用,在编译器间就已经定了,是静态的。也是_它们?strong>地址在编译期q定了Q?span style="COLOR: #ff0000">早绑?/span>Q,因此Q?strong>重蝲和多态无?/span>Q?br>
重写Q和多态真正相兟뀂当子类重新定义了父cȝ虚函数后Q父cL针根据赋l它的不同的子类指针Q动态的调用属于子类的该函数Q?strong>q样的函数调用在~译期间是无法确定的Q调用的子类的虚函数的地址无法l出Q。因此,q样的函数地址是在q行期绑定的Q晚l定Q?/strong>
19. 多态的作用Q?br>
主要是两个:1. 隐藏实现l节Q得代码能够模块化Q扩展代码模块,实现代码重用Q?. 接口重用Qؓ了类在承和z的时候,保证使用家族中Q一cȝ实例的某一属性时的正调用?br>
20. Ado与Ado.net的相同与不同Q?/strong>
除了“能够让应用程序处理存储于DBMS 中的数据“q一基本怼点外Q两者没有太多共同之处。但是Ado使用OLE DB 接口q基于微软的COM 技术,而ADO.NET 拥有自己的ADO.NET 接口q且Z微Y?NET 体系架构。众所周知.NET 体系不同于COM 体系QADO.NET 接口也就完全不同于ADO和OLE DB 接口Q这也就是说ADO.NET 和ADO是两U数据访问方式。ADO.net 提供对XML 的支持?/font>
21. New delete 与malloc free 的联pM区别?
{案Q?span style="COLOR: #ff0000">都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数ƈ?span style="COLOR: #0000ff">不能初始化对象,new 会自动调用对象的构造函?/span>?span style="COLOR: #0000ff">delete 会调用对象的destructorQ而free 不会调用对象的destructor.
22. #define DOUBLE(x) x+x Qi = 5*DOUBLE(5)Q?i 是多?
{案Qi ?0?br>
23. 有哪几种情况只能用intialization list 而不能用assignment?
{案Q当cM含有const、reference 成员变量Q基cȝ构造函数都需要初始化表?br>
24. C++是不是类型安全的Q?/strong>
{案Q不是。两?strong>不同cd的指针之间可以强制{?/span>Q用reinterpret cast)。C#是类型安全的?br>
25. main 函数执行以前Q还会执行什么代码?
{案Q全局对象的构造函C在main 函数之前执行?br>
26. 描述内存分配方式以及它们的区?
1Q??strong>静态存储区域分配。内存在E序~译的时候就已经分配好,q块内存在程序的整个q行期间都存在。例如全局变量Qstatic 变量?/strong>
2Q??span style="COLOR: #ff0000">栈上创徏。在执行函数Ӟ函数?span style="BACKGROUND-COLOR: #888888">局部变?/span>的存储单元都可以在栈上创建,函数执行l束时这些存储单元自动被释放?strong>栈内存分配运内|于处理器的指o?/span>?br>3Q??span style="COLOR: #ff0000">堆上分配Q亦U动态内存分?/span>。程序在q行的时?strong>用malloc 或new 甌L多少的内存,E序员自p责在何时用free 或delete 释放内存?/strong>动态内存的生存期由E序员决定,使用非常灉|Q但问题也最?/span>?br>
27.struct ?class 的区?/strong>
{案Q?strong>struct 的成员默认是公有?/strong>Q而类的成员默认是U有的?span style="COLOR: #ff0000">struct ?class 在其他方面是功能相当?/strong>?br>
从感情上Ԍ大多数的开发者感到类和结构有很大的差别?strong>感觉上结构仅仅象一堆缺乏封装和功能的开攄内存位,而类pzȝq且可靠的社会成?/strong>Q它有智能服务,有牢固的装屏障和一个良好定义的接口。既然大多数人都q么认ؓQ那?/font>只有在你的类有很的Ҏ(gu)q且有公有数据(q种事情在良好设计的pȝ中是存在?Q时Q你也许应该使用 struct 关键字,否则Q你应该使用 class 关键字?
28.当一个类A 中没有生命Q何成员变量与成员函数,q时sizeof(A)的值是多少Q如果不是零Q请解释一下编译器Z么没有让它ؓ零。(AutodeskQ?/span>
{案Q肯定不是零。D个反例,如果是零的话Q声明一个class A[10]对象数组Q而每一个对象占用的I间是零Q这时就没办法区分A[0],A[1]…了?br>
29. ?086 汇编下,逻辑地址和物理地址是怎样转换的?QIntelQ?br>{案Q通用寄存器给出的地址Q是D内偏移地址Q相?span style="COLOR: #ff0000">D寄存器地址*10H+通用寄存器内地址Q就得到了真正要讉K的地址?br>
30. 比较C++中的4U类型{换方式?
请参考:http://blog.csdn.net/wfwd/archive/2006/05/30/763785.aspxQ重Ҏ(gu)static_cast, dynamic_cast和reinterpret_cast的区别和应用?br>
31.分别写出BOOL,int,float,指针cd的变量a ?#8220;?#8221;的比较语句?/strong>
{案Q?br>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)
32.误出const?define 相比Q有何优点?
{案Q?Q?strong> const 帔R有数据类型,而宏帔R没有数据cd。编译器可以对前者进行类型安全检查。而对后者只q行字符替换Q没有类型安全检?/strong>Qƈ且在字符替换可能会生意料不到的错误?br>2Q?有些集成化的调试工具可以对const 帔Rq行调试Q但是不能对宏常量进行调?/strong>?br>
33.q数l与指针的区别?
数组要么在静态存储区被创建(如全局数组Q,要么在栈上被创徏。指针可以随时指向Q意类型的内存块?br>(1)修改内容上的差别
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 注意p 指向帔R字符?br>p[0] = ‘X’; // ~译器不能发现该错误Q运行时错误
(2) 用运符sizeof 可以计算出数l的定wQ字节数Q。sizeof(p),p 为指针得到的是一个指针变量的字节敎ͼ而不是p 所指的内存定w。C++/C 语言没有办法知道指针所指的内存定wQ除非在甌内存时记住它。注意当数组作ؓ函数的参数进行传递时Q该数组自动退化ؓ同类型的指针?br>char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字节
cout<< sizeof(p) << endl; // 4 字节
计算数组和指针的内存定w
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不?00 字节
}
34.cL员函数的重蝲、覆盖和隐藏区别Q?/strong>
{案Q?br>a.成员函数被重载的特征Q?br>Q?Q相同的范围Q在同一个类中)Q?br>Q?Q函数名字相同;
Q?Q参C同;
Q?Qvirtual 关键字可有可?/span>?br>b.覆盖是指zcd数覆盖基cd?/span>Q特征是Q?br>Q?Q?span style="COLOR: #0000ff">不同的范?/strong>Q分别位于派生类与基c)Q?br>Q?Q?strong>函数名字相同Q?br>Q?Q?strong>参数相同Q?br>Q?Q?strong>基类函数必须有virtual 关键?/span>?虚函?added by alphajay)
c.“隐藏”是指zcȝ函数屏蔽了与其同名的基类函数Q规则如下:
Q?Q?span style="COLOR: #0000ff">如果zc?/span>的函C基类的函数同名,但是参数不同。此Ӟ不论有无virtual关键字,基类的函数将被隐藏(注意别与重蝲hQ?br>Q?Q?span style="COLOR: #0000ff">如果zcȝ函数与基cȝ函数同名Qƈ且参C相同Q但?span style="COLOR: #ff0000">基类函数没有virtual 关键?/span>。此Ӟ基类的函数被隐藏Q?span style="COLOR: #ff0000">注意别与覆盖hQ?br>
35. There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.
{案Q? ( a + b ) + abs( a - b ) ) / 2
36. 如何打印出当前源文g的文件名以及源文件的当前行号Q?br>{案Q?br>cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系l预定义宏,q种宏ƈ不是在某个文件中定义的,而是q译器定义的?br>
37. main d数执行完毕后Q是否可能会再执行一D代码,l出说明Q?br>{案Q?strong>可以Q可以用_onexit 注册一个函?/strong>Q它会在main 之后执行int fn1(void), fn2(void), fn3(void), fn4 (void);
void main( void )
{
String str("zhanglin");
_onexit( fn1 );
_onexit( fn2 );
_onexit( fn3 );
_onexit( fn4 );
printf( "This is executed first.\n" );
}
int fn1()
{
printf( "next.\n" );
return 0;
}
int fn2()
{
printf( "executed " );
return 0;
}
int fn3()
{
printf( "is " );
return 0;
}
int fn4()
{
printf( "This " );
return 0;
}
The _onexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed in LIFO (last-in-first-out) order. The functions passed to _onexit cannot take parameters.
38. 如何判断一D늨序是由C ~译E序q是由C++~译E序~译的?
{案Q?br>#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif
分析Q?nbsp;
#include <cstdlib>
#include <iostream>
using namespace std;
unsigned int foo(unsigned int *arr)
{
unsigned int p[] ={1,2,6,24,120,720,5040,40320,362880};
unsigned int i,j,c,s=p[8];//first the number is p99
for(i = 0; i < 7; i++)
for(j = i+1; j < 8; j++)
{
if(arr[i]>arr[j]) //swap two number
{
arr[i]^=arr[j];
arr[j]^=arr[i];
arr[i]^=arr[j];
}
}
i = 0;
c = 0;
while(i<8)
{
j = i+1;
while(arr[i]==arr[j])//compute the number of the repetition
{
c++;
j++;
}
s/=p[c];
c=0;
i=j;
}
return s;
}
int main()
{
unsigned int a[]={1,3,3,5,6,7,8,8,9};
cout<<"The number of permutation is: "<<foo(a)<<endl;
system("pause");
return 0;
}
q可以改q排序那部分?/p>
转一个经典的题目Q?/p>
l一个天q?问如何用3ơ把q个球扑և?
q且求出q个球是比其他的轻q是?
?2个球分别~号为a1,a2,a3.......a10,a11,a12.
W一步:?2球分开3拨,每拨4个,a1~a4W一拨,Cؓb1Q?nbsp;a5~a8W?拨,Cؓb2Q其余第3拨,Cؓb3Q?
W二步:b1和b2攑ֈ天^两盘上,记左盘ؓc1Q右为c2Q这时候分两中情况Q?
1.c1和c2qQ此时可以确定从a1到a8都是常球Q然后把c2拿空Qƈ从c1上拿下a4Q从a9到a12四球里随便取三球Q假设ؓa9到a11Q放到c2上。此时c1上是a1到a3Qc2上是a9到a11。从q里又分三种情况Q?
AQ天q_^衡,很简单,说明没有放上ȝa12是异球Q而到此步一q了两ơ,所以将a12随便?1个常球再UCơ,也就是第三次Q马上就可以定a12是重q是轻;
BQ若c1上升Q则q次U说明异球ؓa9到a11三球中的一个,而且是比常球重。取下c1所有的球,q将a8攑ֈc1上,a9取下Q比较a8和a11Q第三次UͼQ如果^衡则说明从c2上取下的a9是偏重异球,如果不^衡,则偏向哪盘则哪盘里放的就是偏重异球;
CQ若c1下降Q说明a9到a11里有一个是偏轻异球。次U情况和BcMQ所以接下来的步骤照搬B是Q?
2.c1和c2不^衡,q时候又分两U情况,c1上升和c1下降Q但是不哪U情况都能说明a9到a12是常球。这步是解题的关键。也是这个题最妙的地方?
AQc1上升Q此时不能判断异球在哪盘也不能判断是轻还是重。取下c1中的a2到a4三球放一边,c2中的a5和a6攑ֈc1上,然后常球a9攑ֈc2上。至此,c1上是a1Qa5和a6Qc2上是a7Qa8和a9。此时又分三中情况:
1Q如果^衡,说明天^上所有的球都是常球,异球在从c1上取下a2到a4中。而且可以断定异球轻重。因为a5到a8都是常球Q而第2ơ称的时候c1是上升的Q所以a2到a4里必然有一个轻球。那么第三次U就用来从a2到a4中找到轻球。这很简单,随便拿两球放到c1和c2Q^衡则剩余的ؓ要找球,不^衡则哪边低则哪个扄Q?
2Qc1仍然保持上升Q则说明要么a1是要扄ȝQ要么a7和a8两球中有一个是重球Q这步懂吧?好好xQ很单的。因为a9是常球,而取下的a2到a4肯定也是常球Q还可以推出换盘攄的a5和a6也是常球。所以要么a1轻,要么a7或a8重)。至此,q剩一ơ称的机会。只需把a7和a8放上两盘Q^衡则说明a1是要扄偏轻异球Q如果不qQ则哪边高说明哪个是偏重异球Q?
3Q如果换球称W?ơ后天^q打破Qƈ且c1降低了,q说明异球肯定在换过来的a5和a6两求中,q且异球偏重Q否则天q么^衡要么保持c1上升。确定要扄是偏重之后,a5和a6攑ֈ两盘上称W?ơ根据哪辚w可以判定a5和a6哪个是重球;
BQ第1ơ称后c1是下降的Q此时可以将c1看成c2Q其实以后的步骤都同AQ所以就不必要再重复叙述了。至此,不管情况如何Q用且只用三ơ就能称?2个外观手感一模一L球中有质量不同于其?1球的偏常的球。而且在称的过E中可以判定其是偏轻q是偏重?
3.U2 合唱团在17 分钟内得赶到演唱会场Q途中必需跨过一座桥Q四个h从桥的同一端出发,你得帮助他们到达另一端,天色很暗Q而他们只有一只手늭。一ơ同时最多可以有两h一赯桥,而过桥的时候必L有手늭Q所以就得有人把手电(sh){带来带去,来回桥两端。手늭是不能用丢的方式来传递的。四个h的步行速度各不同,若两人同行则以较慢者的速度为准。Bono 需? 分钟q桥QEdge 需? 分钟q桥QAdam需?5 分钟q桥QLarry 需?0 分钟q桥。他们要如何?7 分钟内过桥呢Q(有个同济的学生写文章说他当时在微软面试时是到了这道题Q最短只能做出在19分钟内过桥,微Y的h对他讲这Ll果已经是不错的了!Q?nbsp;
A点到 B ?
1 ? q去 2 分钟 2
2 q来 4 分钟 2+2=4
10?5q去 14 分钟 4+10=14
1 q来 15 分钟 14+1=15
1 ? q去 17 分钟 15+2=17
W一l?nbsp;
1.烧一根不均匀的Q从头烧到尾d需?个小时。现在有若干条材质相同的l_Q问如何用烧l的Ҏ(gu)来计时一个小时十五分钟呢?
ans:三根lI开始的时候,W一根点燃两端,W二根点燃一端,W三根不?/font>?font color=#ff0000>W一根烧完(30分钟)后,点燃W二根的另一?/font>Q第二根只要15分钟可以烧完了Q第二根l烧?45分钟)后,点燃W三根子两端,W三根烧完(1时15?后,计时完成
2.你有一桶果冻,其中有黄艌Ӏ绿艌Ӏ红色三U,闭上眼睛抓取同种颜色的两个。抓取多个可以确定你肯定有两个同一颜色的果?
3.如果你有无穷多的_一?公升的提捅,一?公升的提捅,两只提捅形状上下都不均匀Q问你如何才能准称?公升的水?
4.一个岔路口分别通向诚实国和说谎国。来了两个hQ已知一个是诚实国的Q另一个是说谎国的。诚实国永远说实话,说谎国永q说谎话。现在你要去说谎国,但不知道应该走哪条\Q需要问q两个h。请问应该怎么?
5.12个球一个天qI现知道只有一个和其它的重量不同,问怎样U才能用三次找到那个球?3个呢?(注意此题q未说明那个球的重量是轻是重Q所以需要仔l考虑)
6.?个点上画10条直U,要求每条直线上至有三个?
7.在一天的24时之中Q时钟的旉、分针和U针完全重合在一L时候有几次?都分别是什么时?你怎样出来的?
8.怎么L?|木,使其中Q意两|的距ȝ{?
W二l?nbsp;
1.Z么下水道的盖子是圆的?
2.中国有多辆汽R?
3.汽车钥匙插入R门,向哪个方向旋转就可以打开车锁?
4.如果你要L中国?4个省(含自d、直辖市和港澳特区及台湾?中的M一个,你会L哪一个,Z?
5.多少个加油站才能满中国的所有汽?
6.惌你站在镜子前Q请问,Z么镜子中的媄象可以颠倒左叻I却不能颠倒上?
7.Z么在M旅馆里,你打开热水Q热水都会瞬间倾泻而出?
8.你怎样Excel的用法解释给你的奶奶?
9.你怎样重新改进和设计一个ATM银行自动取款?
10.如果你不得不重新学习一U新的计机语言Q你打算怎样着手来开?
11.如果你的生规划中打在5q内受到奖励Q那获取该项奖励的动机是什?观众是谁?
12.如果微Y告诉你,我们打算投资五百万美元来启动你的投资计划Q你开始什么样商业计划?Z?
13.如果你能够将全世界的?sh)脑厂商集合在一个办公室里,然后告诉他们被做一件事Q那件事是什?
W三l?nbsp;
1.你让工hZ工作7天,回报是一栚w条,q个金条q_成相q的7D,你必d每天l束的时候给他们一D金条。如果只允许你两ơ把金条弄断Q你如何l你的工Z?
2.有一辆火车以每小?5公里的速度d北京直奔q州Q同时另一辆火车每时20公里的速度从广州开往北京。如果有一只鸟Q以30公里每小时的速度和两辆火车同时启动,从北京出发,到另一辆R后就向相反的方向q回去飞Q就q样依次在两辆火车之间来回地飞,直到两辆火R盔R。请问,q只鸟共飞行了多长的距离?
3.你有四个装药丸的|子Q每个药且R有一定的重量Q被污染的药丸是没被污染的药丸的重量+1。只U量一ơ,如何判断哪个|子的药被污染了?
4.门外三个开兛_别对应室内三盏灯Q线路良好,在门外控制开x候不能看到室内灯的情况,现在只允许进门一ơ,定开兛_灯的对应关系?
5.人民币ؓ什么只????0的面?
6.你有两个|子以及50个红色弹球和50个蓝色弹球,随机选出一个罐子, 随机选出一个弹球放入罐子,怎么l出U色弹球最大的选中Z?在你的计划里Q得到红球的几率是多?
7.l你两颗6面色子,可以在它们各个面上刻?-9L一个数字,要求能够用它们拼ZQ意一q中的日期数?br>
W四l?nbsp;
W一?nbsp;. 五个L抢到?00颗宝矻I每一颗都一样大和价D城。他们决定这么分Q?br>
抽签军_自己的号?1????)
首先Q由1h出分配方案,然后大家表决Q当且仅当超q半数的人同意时Q按照他的方?br>
q行分配Q否则将被扔q大喂鲨鱼
如果1h后,再由2h出分配方案,然后剩下?行表冻I当且仅当过半数的h?br>
意时Q按照他的方案进行分配,否则被扔入大v喂鲨?br>
依此cL
条gQ每个v盗都是很聪明的hQ都能很理智地做出判断,从而做出选择?br>
问题Q第一个v盗提出怎样的分配方案才能自己的收益最大化?
W二?nbsp;. 一道关于飞机加油的问题Q已知:
每个飞机只有一个a,
飞机之间可以怺加a(注意是相互,没有加a?
一a可供一枉机绕地球飞半圈,
问题Q?br>
Z臛_一枉机绕地球一圈回到v飞时的飞机场Q至需要出动几枉?(所有飞Z同一机场起飞Q而且必须安全q回机场Q不允许中途降落,中间没有飞机?W三? 汽R加a问题
一辆蝲?00升的汽R从A开往1000公里外的BQ已知汽车每公里耗a量ؓ1升,A处有无穷多的油,其他M地点都没有aQ但该R可以在Q何地点存放a以备中{Q问从A到B最需要多a
W四? h问题
一U杯子,若在WN层被摔破Q则在Q何比N高的楼层均会_若在WM层不_则在M比M低的楼层均会_l你两个q样的杯子,让你?00层高的楼层中试Q要求用最的试ơ数扑և恰y会杯子破碎的楼层?br>
W五? 推理游戏
教授选出两个??的数Q把它们的和告诉学生Ԍ把它们的U告诉学生乙Q让他们轮流猜这两个?br>
甲说Q?#8220;我猜不出”
乙说Q?#8220;我猜不出”
甲说Q?#8220;我猜C”
乙说Q?#8220;我也猜到?#8221;
问这两个数是多少
W六? 病狗问题
一个住宅区内有100户hӞ每户人家M条狗Q每天傍晚大安在同一个地斚w狗。已知这些狗中有一部分病狗Q由于某U原因,狗的Mh无法判断自己的狗是否是病狗,却能够分辨其他的狗是否有病,现在Q上U传来通知Q要求住户处册些病狗,q且不允许指认他人的狗是病狗(是只能判断自己?Q过?天之后,所有的病狗都被处决了,问,一共有几只病狗?Z?
W八? 监狱里有100个房_每个戉K内有一囚犯。一天,监狱长说Q你们狱房外有一늁Q你们在N时可以控制这个电(sh)?熄或?。每天只能有一个h出来NQƈ且防风是随机的。如果在有限旉内,你们中的某h能对我说Q?#8220;我敢保证Q现在每个h都已l至放q一ơ风了?#8221;我就放了你们!问囚犯们要采取什么策略才能被监狱长放?如果采用了这U策略,大致多久他们可以被释?
W五l?nbsp;
1.某手机厂家由于设计失误,有可能造成甉|寿命比原来设计的寿命短一?不是冲放甉|?Q解x案就是免Ҏ(gu)换电(sh)池或l?0元购买该厂家新手机的折换券。请l所有已购买的用户写信告诉解x案?br>
2.一高层领导在参观某博物馆时Q向博物馆馆员小王要了一块明代的城砖作ؓU念Q按国家规定QQ何h不得博物馆收藏品变为私有。博物馆馆长需要如何写信给q位领导Q将城砖取回?br>
3.营业员小姐由于工作失误,?万元的笔记本?sh)脑?.2万元错卖l李先生Q王姐的经理怎么写信l李先生试图钱要回?
4.l你一ƾ新研制的手机,如果你是试l的l长Q你会如何测?
5.如何为函数int atoi(const char * pstr)~写试向量?
W六l?nbsp;
1.链表和数l的区别在哪?
2.~写实现链表排序的一U算法。说明ؓ什么你会选择用这LҎ(gu)?
3.~写实现数组排序的一U算法。说明ؓ什么你会选择用这LҎ(gu)?
4.L写能直接实现char * strcpy(char * pstrDest,const char * pstrSource)函数功能的代码?br>
5.~写反{字符串的E序Q要求优化速度、优化空间?br>
6.在链表里如何发现循环链接?
7.l出z牌的一个算法,q将z好的牌存储在一个整形数l里?br>
8.写一个函敎ͼ查字W是否是整数Q如果是Q返回其整数倹{?或者:怎样只用4行代?br>
9.l出一个函数来输出一个字W串的所有排列?br>
10.L写实现void * malloc(int)内存分配函数功能一L代码?br>
11.l出一个函数来复制两个字符串A和B。字W串A的后几个字节和字W串B的前几个字节重叠?br>
12.怎样~写一个程序,把一个有序整数数l放C叉树?
13.怎样从顶部开始逐层打印二叉树结Ҏ(gu)?LE?br>
14.怎样把一个链表掉个顺?也就是反序,注意链表的边界条件ƈ考虑I链?? --
15.L写能直接实现int atoi(const char * pstr)函数功能的代?br>
-----------------------------------------------------------------------------------
W一l题{案Q?nbsp;
2)Ҏ(gu)抽屉原理Q??br>
3)3升装?3???全注?;3升装?3?????;5升倒掉;3???注入1?;3升装?3???完成(另:可用回溯法编E求?
4)问其中一人:另外一个h会说哪一条\是通往诚实国的?回答者所指的那条路必然是通往说谎国的?br>
5)12个球Q?br>
W一ơ:4Q? 如果q了Q?br>
那么剩下的球中取3攑ַ??个好球放双Q称Q?br>
如果左边重,那么取两个球UC下,哪个重哪个是ơ品Q^的话W三个重Q是ơ品Q轻的话同理
如果q了Q那么剩下一个次品,q可Ҏ(gu)需要称出次品比正品L者重
如果不^Q?br>
那么不妨讑ַ辚w双轻,Z便于说明Q将左边4颗称为重球,双4颗称球,剩下4颗称为好?br>
取重?颗,ȝ2颗放在左侧,右侧?颗好球和一颗轻?br>
如果左边?br>
U那两颗重球Q重的一个次品,q的话右边轻球次?br>
如果双?br>
U左边两颗轻球,ȝ一个次?br>
如果q?br>
U剩下两颗重球,重的一个次品,q的话剩下那颗轻球次?br>
13个球Q?br>
W一ơ:4Q?Q如果^?br>
?颗球用上面的Ҏ(gu)仍旧能找出次品,只是不能知道ơ品是重是轻
如果不^Q同上
6)
o o o
o o o
o o o
7)
23ơ,因ؓ分针要{24圈,旉才能?圈,而分针和旉重合两次之间的间隔显?gt;1时Q它们有23ơ重合机会,每次重合中秒针有一ơ重合机会,所以是23?br>
重合旉可以对照手表求出Q也可列方程求出
8)
在地球表面种树,做一个地球内接的正四面体Q内接点即ؓ所?br>
W二l?nbsp;无标准答?nbsp;
W三l?nbsp;
1. 分成1,2,4三段Q第一天给1Q第二天l?取回1Q第3天给1Q第4天给4取回1?Q第5天给1Q第6天给2取回1Q第七天l?
2. 求出火R盔R旉Q鸟速乘以时间就是鸟飞行的距?br>
3. 四个|子中分别取1,2,3,4颗药丸,U出比正帔R多少Q即可判断出那个|子的药被污?br>
4. 三个开兛_别:养I开Q开10分钟Q然后进屋,暗且凉的为开?控制的灯Q亮的ؓ开?控制的灯Q暗且热的ؓ开?控制的灯
5. 因ؓ可以?Q?Q?Q?0l合成Q何需要的货币|日常习惯?0q制
6. 题意不理?..*_*
7. 012345 0126(9)78
W四l?nbsp;都是很难的题?nbsp;
W一题:97 0 1 2 0 或?nbsp;97 0 1 0 2 (提示Q可用逆推法求?
W二题:3枉?架次Q飞法:
ABC 3架同时v飞,1/8处,ClAB加满油,Cq航Q?/4处,BlA加满油,Bq航QA到达1/2处,C从机场往另一方向起飞Q?/4处,C同已l空油箱的Aq_剩余沚wQ同时B从机v飞,AC?/8处同Bq_剩余沚wQ刚?枉机同时返航。所以是3枉?架次。第三题Q需要徏立数学模?nbsp;
(提示Q严D明该模型最优比较麻烦,但确实可证,大胆猜想是解题关?
题目可归lؓ求数?nbsp;an=500/(2n+1) n=0,1,2,3......的和Sn什么时候大于等?000,解得n>6
当n=6ӞS6=977.57
所以第一个中转点v始位|距Mؓ1000-977.57=22.43公里
所以第一ơ中转之前共耗a 22.43*(2*7+1)=336.50?br>
此后每次中{耗a500?br>
所以总耗a量ؓ7*500+336.50=3836.50?br>
W四题:需要徏立数学模?br>
题目可归lؓ求自然数列的和S什么时候大于等?00Q解得n>13
W一个杯子可能的投掷楼层分别为:14Q?7Q?9Q?0Q?0Q?9Q?7Q?4Q?0Q?5Q?9Q?00
W五题:3?(可严D?
设两个数为n1Qn2Qn1>=n2Q甲听到的数为n=n1+n2Q乙听到的数为m=n1*n2
证明n1=3Qn2=4是唯一?br>
证明Q要证以上命题ؓ真,不妨先证n=7
1)必要性:
i) n>5 是显然的Q因为n<4不可能,n=4或者n=5甲都不可能回{不知道
ii) n>6 因ؓ如果n=6的话Q那么甲虽然不知?不确?+4q是3+3)但是无论?Q?q是3Q?乙都不可能说不知?m=8或者m=9的话乙说不知道是没有道理?
iii) n<8 因ؓ如果n>=8的话Q就可以n分解?nbsp;n=4+x ?nbsp;n=6+(x-2)Q那么m可以?x也可以是6(x-2)?x=6(x-2)的必要条件是x=6即n=10Q那样n又可以分解成8+2Q所以M当n>=8Ӟn臛_可以分解成两U不同的合数之和Q这样乙说不知道的时候,甲就没有理由马上说知道?br>
以上证明了必要?br>
2)充分?br>
当n=7Ӟn可以分解?+5?+4
昄2+5不符合题意,舍去Q容易判断出3+4W合题意Qm=12Q证?br>
于是得到n=7 m=12 n1=3 n2=4是唯一解。第六题Q??数学归纳法证?
1)若只?只病狗,因ؓ病狗Mh看不到有其他病狗Q必然会知道自己的狗是病?前提是一定存在病?Q所以他会在W一天把病狗处决?br>
2)设有k只病狗的话,会在Wk天被处决Q那么,如果有k+1只,病狗的主人只会看到k只病狗,而第k天没有h处决病狗Q病狗主人就会在Wk+1天知道自q狗是病狗Q于是病狗在Wk+1天被处决
3)?)2)得,若有n只病狗,必然在第n天被处决
W八题:
U定好一个h作ؓ报告?可以是第一个放风的?
规则如下Q?br>
1、报告hN的时候开灯ƈ数开灯次?br>
2、其他hW一ơ遇到开着灯放风时Q将灯关?br>
3、当报告人第100ơ开灯的时候,d监狱长报告,要求监狱长放?.....
按照概率大约30q后(10000?他们可以被释?br>
W五l无标准{案
W六l部分题参考答案:
4.
char * strcpy(char * pstrDest,const char * pstrSource)
{
assert((pstrDest!=NULL)&&(pstrSource!=NULL));
char * pstr=pstrDest;
while((*(pstrDest++)=*(pstrSource++))!='\0');
return pstr;
}
5.
char * strrev(char * pstr)
{
assert(pstr!=NULL);
char * p=pstr;
char * pret=pstr;
while(*(p++)!='\0');
p--;
char tmp;
while(p>pstr)
{
tmp=*p;
*(p--)=*(pstr);
*(pstr++)=tmp;
}
return pret;
癑ֺW试题:
IPD|?ip1 ip2。之间以I格分开Qip形式为X.X.X.XQ数据保存在文g中,文g不超q?k行,无序。现在要求编写算法去掉可重IPQ可重有三种形式Q包含、交叠、紧靠?
例如Q文件内容ؓQ?
10.0.0.0 10.0.0.12
10.0.0.5 10.0.0.10 ( <= 包含)
10.0.0.8 10.0.0.15 ( <= 交叠)
10.0.0.15 10.0.0.24 ( <= 紧靠)
最后输Zؓ:
10.0.0.0 10.0.0.24
codeQ?br>/*
**q个函数的作用是文件中的一行对应的两个数据转换成整形的数据
**比如?0.0.0.0 10.0.0.12 转换后,left=10*224,是10.0.0.0对应的整敎ͼ每个数字对应8位,right=left+12
*/
void ParseLine( char line[], size_t length, unsigned int &left, unsigned int &right)
{
size_t i;
for( i=0; i<length; i++ )
{
if ( line[i]=='.' || line[i]==' ' )//点变成0
{
line[i]=0;
}
}
char *p = (char*)&left;
char *num = line;
for( i=3; i<4; --i ) //size是size_tQ而size_t是unsigned intQ所以i=0再自减后变成了最大的整数Q@环就会终?br> {
// cout<<i<<",";
*(p+i) = strtol( num, &num ,10 );
cout<<static_cast<int>(*(p+i))<<",";
++num;
// cout<<num<<":";
}
cout<<endl;
p = (char*)&right;
for( i=3; i<4; --i )
{
*(p+i) = strtol( num, &num, 10 );
++num;
}
}
void UniqueSequence( vector<unsigned int> & uSeq, unsigned int left, unsigned int right )
{
size_t i, lPos=-1, rPos=-1;
for( i=0; i<uSeq.size(); i++ )
{
if( left <= uSeq.at(i) )
{
lPos = i;
break;
}
}
for( ;i<uSeq.size(); i++ )
{
if( right<=uSeq.at(i) )
{
rPos=i;
break;
}
}
if( lPos == -1 )
{
uSeq.push_back( left );
uSeq.push_back( right );
return;
}
if( lPos%2 == 0 )
{
if( uSeq.at(lPos)==left )
{
}
else
{
uSeq.insert( uSeq.begin()+lPos, left );
}
}
else
{
--lPos;
}
if( rPos == -1 )
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.end() );
uSeq.push_back(right);
}
else if( rPos%2 == 0 )
{
if( uSeq.at(rPos)== right )
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+(rPos+1) );
}
else
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );
uSeq.insert( uSeq.begin()+rPos, right );
}
}
else
{
uSeq.erase( uSeq.begin()+(lPos+1), uSeq.begin()+rPos );
}
}
void PrintIP( unsigned int num )
{
char *p = (char*)#
for( size_t i=3;i>0; --i)
{
cout<< (int)p[i]<<".";
}
cout<<(int)p[0];
}
#define MAX_BUFFER_LENGTH 100
int main()
{
unsigned int left, right;
char buffer[MAX_BUFFER_LENGTH];
ifstream infile( "test.txt" );
if( infile.fail() )
{
return 0;
}
vector<unsigned int> uSeq;
while( infile.getline(buffer, MAX_BUFFER_LENGTH) )
{
ParseLine(buffer, strlen(buffer), left, right);
// cout<<left<<","<<right<<endl;
UniqueSequence( uSeq, left, right );
for( size_t i=0; i<uSeq.size(); i+=2 )
{
PrintIP(uSeq.at(i) );
cout<<" ";
PrintIP(uSeq.at(i+1));
cout<<endl;
}
cout<<endl;
}
for( size_t i=0; i<uSeq.size(); i+=2 )
{
PrintIP(uSeq.at(i) );
cout<<" ";
PrintIP(uSeq.at(i+1));
cout<<endl;
}
return 0;
}
/*long strtol( const char *nptr, char **endptr, int base ),其中nptr是以NULLl尾字符Ԍendptr是字W串停止扫描的地方(Pointer to character that stops scanQ,strtol returns the value represented in the string nptrQThe strtol function converts nptr to a long. strtol stops reading the string nptr at the first character it cannot recognize as part of a number. This may be the terminating null character, or it may be the first numeric character greater than or equal to base.
string = "-10110134932This stopped it";
l = strtol( string, &stopstring, 10 );
printf( "string = %s", string );
printf(" strtol = %ld", l );
printf(" Stopped scan at: %s", stopstring );
string = "10110134932";
printf( "string = %s\n", string );
/* Convert string using base 2, 4, and 8: */
for( base = 2; base <= 8; base *= 2 )
{
/* Convert the string: */
ul = strtoul( string, &stopstring, base );
printf( " strtol = %ld (base %d)\n", ul, base );
printf( " Stopped scan at: %s\n", stopstring );
}
打印的结果是Q?br>string = -10110134932This stopped it strtol = -2147483647 Stopped scan at: This stopped itstring = 10110134932
strtol = 45 (base 2)
Stopped scan at: 34932
strtol = 4423 (base 4)
Stopped scan at: 4932
strtol = 2134108 (base 8)
Stopped scan at: 932
*/
5.如果存在两个变量Qa和bQ不使用“if”?#8220;?:”?“switch”和其它的判断语句Q找Z个数中的最大倹{?br> {案Q? ( a + b ) + abs( a - b ) ) / 2
6. 写一个函数找Z个整数数l中Q第二大的数 QmicrosoftQ?br> const int MINNUMBER = -32767 ;
int find_sec_max( int data[] , int count)
{
int maxnumber = data[0] ;
int sec_max = MINNUMBER ;
for ( int i = 1 ; i < count ; i++)
{
if ( data[i] > maxnumber )
{
sec_max = maxnumber ;
maxnumber = data[i] ;
}
else
{
if ( data[i] > sec_max )
sec_max = data[i] ;
}
}
return sec_max ;
}
一、如何判断一个单链表是有环的Q(注意不能用标志位Q最多只能用两个额外指针Q?br> struct node { char val; node* next;}
bool check(const node* head) {} //return false : 无环Qtrue: 有环
一UOQnQ的办法是Q搞两个指针Q一个每ơ递增一步,一个每ơ递增两步Q如果有环的话两者必焉合,反之亦然Q:
bool check(const node* head)
{
if(head==NULL)
return false;
node *low=head, *fast=head->next;
while(fast!=NULL && fast->next!=NULL)
{
low=low->next;
fast=fast->next->next;
if(low==fast)
return true;
}
return false;
}
二、删除一个单w表的最中间的元素,要求旉可能短Q不能用两ơ@环)
struct link
{
int data;
struct link *next;
};
void delMiddle(link *head)
{
if(head == NULL)
return;
else if(head->next == NULL)
{
delete head;
return;
}
else
{
link *low = head;
link *fast = head->next;
while(fast != NULL && fast->next != NULL)
{
fast = fast->next->next;
if(fast == NULL)
break;
low = low->next;
}
link *temp = low->next;
low->next = low->next->next;
delete temp;
}
}
int main()
{
struct link *head,*l;
struct link *s;
head = (link*)malloc(sizeof(link));
head->data=0;
head->next = NULL;
l = head;
for(int i=1; i<9; i++)
{
s = (link*)malloc(sizeof(link));
s->data = i;
s->next = NULL;
l->next= s;
l = l->next;
}
print(head);
delMiddle(head);
print(head);
return 0;
}
三、输入nQ求一个n*n矩阵Q规定矩阉|45度线递增(威盛)
/**
* 得到如下样式的二l数l?br>* zigzagQjpeg~码里取象素数据的排列顺序)
*
* 0, 1, 5, 6,14,15,27,28,
* 2, 4, 7,13,16,26,29,42,
* 3, 8,12,17,25,30,41,43,
* 9,11,18,24,31,40,44,53,
* 10,19,23,32,39,45,52,54,
* 20,22,33,38,46,51,55,60,
* 21,34,37,47,50,56,59,61,
* 35,36,48,49,57,58,62,63
*/
void zigzag(int n)
{
int **a =(int**) malloc(n*sizeof(int *)); //分配I间
if(NULL == a)
return ;
int i;
for(i = 0; i < n; i++) {
if((a[i] =(int*) malloc(n * sizeof(int))) == NULL) {
while(--i>=0)
free(a[i]);
free(a);
return;
}
}
bool flag = false; //q个标志位用来判断是?5度角生成q是225度角生成
int count = 0;
for(i=0; i<n; i++) //生成的上半部分的数据
{
if(flag)
{
for(int r = 0; r<=i; r++)
{
a[r][i-r] = count;
count++;
}
flag = false;
}
else
{
for(int r = i; r>=0; r--)
{
a[r][i-r] = count;
count++;
}
flag = true;
}
}
for(i=n-1; i>=0; i--) //生成的是下半部分的数?br> {
// cout<<i<<endl;
if(flag)
{
for(int r = 0; r<=i-1; r++)
{
int r1 = n-i+r; //代表当前?br> int c1 = 2*n-i-1-r1; //代表当前?br> a[r1][c1] = count;
count++;
}
flag = false;
}
else
{
for(int r = i-1; r>=0; r--)
{
cout<<"ddd"<<endl;
int r1 = n-i+r;
int c1 = 2*n-i-1-r1;
// cout<<r1<<","<<c1<<endl;
a[r1][c1] = count;
count++;
}
flag = true;
}
}
for(int r = 0; r<n; r++)
{
for(int c=0; c<n; c++)
cout<<a[r][c]<<",";
cout<<endl;
}
}
int main()
{
int n;
cin>>n;
zigzag(n);
return 0;
}
|上q有一个h写了一个比较y的算法:
/**
* 得到如下样式的二l数l?br>* zigzagQjpeg~码里取象素数据的排列顺序)
*
* 0, 1, 5, 6,14,15,27,28,
* 2, 4, 7,13,16,26,29,42,
* 3, 8,12,17,25,30,41,43,
* 9,11,18,24,31,40,44,53,
* 10,19,23,32,39,45,52,54,
* 20,22,33,38,46,51,55,60,
* 21,34,37,47,50,56,59,61,
* 35,36,48,49,57,58,62,63
*/
#include <stdio.h>
int main()
{
int N;
int s, i, j;
int squa;
scanf("%d", &N);
/* 分配I间 */
int **a = malloc(N * sizeof(int *));
if(a == NULL)
return 0;
for(i = 0; i < N; i++) {
if((a[i] = malloc(N * sizeof(int))) == NULL) {
while(--i>=0)
free(a[i]);
free(a);
return 0;
}
}
/* 数组赋?*/
squa = N*N;
for(i = 0; i < N; i++)
for(j = 0; j < N; j++) {
s = i + j;
if(s < N)
a[i][j] = s*(s+1)/2 + (((i+j)%2 == 0)? i : j);
else {
s = (N-1-i) + (N-1-j);
a[i][j] = squa - s*(s+1)/2 - (N - (((i+j)%2 == 0)? i : j));
}
}
/* 打印输出 */
for(i = 0; i < N; i++) {
for(j = 0; j < N; j++)
printf("%-6d", a[i][j]);
printf("\n");
}
return 0;
}
四、打??000的整敎ͼ不能使用程控制语句(for,while,goto{?也不能用递归
1.
typedef struct _test{
static int a;
_test(){
printf("%d\n",_test::a);
a++;
}
}Test;
int Test::a = 1;
int main()
{
Test tt[1000];
return 0;
}
2.
#include <stdio.h>
#define B P,P,P,P,P,P,P,P,P,P
#define P L,L,L,L,L,L,L,L,L,L
#define L I,I,I,I,I,I,I,I,I,I,N
#define I printf( "%3d ",i++)
#define N printf( "\n ")
int main()
{
int i = 1;
B;
}
?br>#define A(x) x;x;x;x;x;x;x;x;x;x;
int main ()
{
int n = 1;
A(A(A(printf ("%d ", n++))));
return 0;
}
五、struct S {
int i;
int * p;
};
void main()
{
S s;
int * p = &s.i;
p[0] = 4;
p[1] = 3;
s.p = p;
s.p[1] = 1;
s.p[0] = 2;
}
问程序会在哪一行死掉?QmicrosoftQ?br>解: S s;
int * p = &s.i; //s.i的地址存储在p?/span>
p[0] = 4; //修改了s.i
p[1] = 3; //修改了s.p
s.p = p; //s.p指向s.i
s.p[1] = 1; //修改s.p本n
s.p[0] = 2; //s.p指向的是0x00000001,试向这里写,出错
s.p[0] = 2; 时出?
因ؓs.p存的是s.i的地址,s.p[1]为s.p,当s.p[1]=1?s.p此时存放的是1?而不是地址s.i,故在s.p[0] = 2时出?
此时相当于s.p=ox00000001;地址ox0000001 = 2;当然出错了
如果语句s.p[0] =2 先于s.p[1]=1则程序就不会出错.此时语句相当于s.i=2;s.p=1;
六、题目描qͼ
1. int swap(int *x,int *y)
{
if(x==NULL ¦ ¦ y==NULL)
return -1;
*x += *y;
*y = *x- *y;
*x -= *y;
return 1;
}
h错,溢出已经考虑Q不是错?
2.
void foo(int *x, int *y)
{
*x += *y;
*x += *y;
}
void fun(int *x, int *y)
{
*x += 2 * (*y);
}
问两个函数是否等P能否互换
解答Q第一题的函数是交换。但假如考虑x, y都是指向同一个变?l果是这个变量的gؓ0.
W二题的两个函数是有区别?也考虑x,y是指向同一个变?q样W一个函数的l果是这个变量的4?但第二个函数的结果是变量??/font>.