石头剪子布:result=(man-computer+4)%3-1
随机数:srand(time(NULL))
曾经我也想问这个问题,我那时候看的是钱能的书,这个原因没有写,后来看了本老外的书知道了, 如果不传引用而传值的话,编译器会报告内存溢出,原因是:
如果参数用值来传递,就需要创建该值的一个副本,如何创建副本呢??使用拷贝构造函数,但是原函数本身就是一个拷贝构造函数,所以它调用的是它自己,于是,形成递归调用,导致耗尽所有的内存
如果传的是引用,这样就可以不要建立副本了.....
看来我比楼主快一点点...我学到后面去了,呵呵!!一起加油!!
使用指针做为函数的形参,只有对指针所指对象进行的操作才会改变实参的值。要实现改变实参,还有一种更安全更自然的方法-引用形参。
http://www.cppblog.com/Solstice/archive/2012/07/06/learncpp.html
syntax semantics…
《C++ Primer 第四版》的代码示例质量很高,不是那种随手写的玩具代码。第10.4.2节实现了带禁用词的单词计数,第10.6利用标准库容器简洁地实现了基于倒排索引思路的文本检索,第15.9节又用面向对象方法扩充了文本检索的功能,支持布尔查询。值得一提的是,这本书讲解继承和多态时举的例子符合Liskov替换原则,是正宗的面向对象。相反,某些教材以复用基类代码为目的,常以“人、学生、老师、教授”或“雇员、经理、销售、合同工”为例,这是误用了面向对象的“复用”。
就学习C++语言本身而言,我认为有几个练习非常值得一做。这不是“重复发明轮子”,而是必要的编程练习,帮助你熟悉掌握这门语言。一是写一个复数类或者大整数类[34],实现基本的运算,熟悉封装与数据抽象。二是写一个字符串类,熟悉内存管理与拷贝控制。三是写一个简化的vector<T>类模板,熟悉基本的模板编程,你的这个vector应该能放入int和string等元素类型。四是写一个表达式计算器,实现一个节点类的继承体系(右图),体会面向对象编程。前三个练习是写独立的值语义的类,第四个练习是对象语义,同时要考虑类与类之间的关系。
箭头操作符(->)的通常用法是,使用一个类对象的指针来调用该指针所指对象的成员。左操作数为对象指针,右操作数为该对象的成员。
溺水的鱼(231391559) 21:26:47
@painberg 当然不行了 你把整个程序好好看看 没有参数 SET容器怎么传递? 没有SET容器 往哪个FOLDER里putmessege?
溺水的鱼(231391559) 21:27:53
因为folders已经存放了messege了 所以删的时候挨个删就行了 不需要参数了
溺水的鱼(231391559) 21:29:30
没存之前 你需要制定哪个folder存放messege所以必须传参
ptr(new int(*(orig.ptr))):首先动态分配一个int型的空间,
初始化为*(orig.ptr),
将此int型空间地址传给ptr..
防止自身赋值:
HasPtr& HasPtr::operator=(HasPtr& rhs)
{
++rhs.ptr->use;
if(--ptr->use==0)
delete ptr;
ptr=rhs.ptr;
val=rhs.val;
return *this;
}
引用和指针的静态类型可以不同,这是C++用以支持多态性的基石。
保留字virtual只在类内部的成员函数声明中出现,不能用在类定义体外部出现的函数定义。
虚函数与默认实参:(P482)http://topic.csdn.net/u/20101230/18/aa062be3-79e3-40cf-826b-b576b20bad3f.html#replyachor
如下定义
class A{
virtual void f(int i = 1){cout<<"a"<<i<<endl;}
};
class B: public class A{
void f(int i = 2){cout<<"b"<<i<<endl;}
}
当有
B b;
A* a = &b;
时
a->f();
其实等价于
a->f(1);
输出为b1
C++ primer 这本书上有这么两句话“派生类虚函数调用基类版本时,必须显式使用作用域操作符。如果派生类函数忽略了这样做,则函数调用会在运行时确定并且将是一个自身调用,从而导致无穷递归。”
这句话应该这样理解:
当你实现派生类虚函数时,如果函数体内需要调用基类的虚函数版本时,需要显式使用基类的作用域操作符,否则就会在派生类作用域内调用派生类版本的虚函数,这样会导致无穷递归。
就是自己在调用自己呀,没有指明调用的是基类的虚函数,自动认为是调用派生类的虚函数,然后就再次调用了,一直进行下去了。
public A
{
virtual void foo(void) { }
};
public B: public A
{
void foo(void)
{
foo(); // 递归调用自己,即 B::foo()
A::foo(); // 明确告诉编译器,调用的是 A::foo(), 而不是自己
}
};
C++中的函数调用默认不使用动态绑定。要触发动态绑定,必须满足两个条件:第一,只有指定为虚函数的成员函数才能进行动态绑定,成员函数默认为非虚函数,非虚函数不进行动态绑定;第二,必须通过基类类型的引用或指针进行函数调用。
(P:483):无论派生列表中是什么访问标号,所有继承Base的类对Base中的成员具有相同的访问。派生访问标号将控制派生类的用户对从八色继承而来的成员的访问。
(P510)
sum+=(*iter)->net_price(items.count(*iter));
sum+=(*iter)->net_price(size(*iter)) ;
构造函数中调用虚函数的问题: http://fuliang.iteye.com/blog/152972
异常处理。。在抛出中对指针解引用,不要抛出指针本身。
auto_ptr对象的复制和赋值是破坏性操作。
(1)找到候选函数集。
(2)从候选集中选择可行函数。
(3)从可行集合中选择一个最佳匹配,并产生代码调用该函数。
posted on 2012-11-29 13:12
painberg 阅读(168)
评论(1) 编辑 收藏 引用