|
发表于 2003-9-7 20:29:43
|
显示全部楼层
回复: 一些C++概念,希望看完,可能对你也有点帮助!
兄弟可多找几本书看看,互相参考,有利于理解问题,而不会由于某本书而产生歧义,而且看的时候尽量看英文版,看中文版时最好和英文版结合起来看,比如你喜欢看 lippman 的书,可以结合 << c++ primer >> 中英文版和 << essential c++ >> 来看,其它的书比如:
<< Think in c++ >>(在线免费下载):
http://www.bruceeckel.com/
http://eongames.com/eckel/
<< The c++ program language >>, 一个 FAQ:
http://www.wushuang.net/article/bsfaq.htm
<< c/c++ 编程大全 >>
之类相对比较全面细致的书。
如果看的时候,不明白的地方很多,不妨到书店买本 << c++ FAQs >>(中文版<< c++ 经典问答 >>) 里面列出了 400 多处 c++ 程序员经常困惑的问题,非常详细,作者是 comp.lang.c++ 网上论坛的管理员,经验丰富。在线版:
http://www.parashift.com/c++-faq-lite/
http://www.sunistudio.com/cppfaq/
最初由 Andy84920 发表
1>
静态成员函数只能访问静态数据成员,而不能通过显示访问某类对象的数据成员(这里讲的舷允镜囊馑季褪遣煌ü齮his指针来访问,(我们知道成员函数访问数据成员其实是用到了this指针的,而表态成员函数没有this指针是吧),是不是?可不可以通过对象经过成员操作符来使用非静态数据成员呢?
乱码,没看懂。
2>
class Bar {
public: // ...
private:
static Bar mem1; //ok
Bar mem2; //error
};
为什么静态成员可以是类本身而非静态就不行呢?静态成员不是在定义类时就要分配空间吗?那类都没有定义
完如何知道它的大小?我们知道可以声明数据成员为类的指针和引用,因为它们的大小不依赖于所指的对象,是固定的.不知道它们的大小如何知道?比如: Bar *pt1;
Bar &pt2; pt1,pt2的大小分别是多少呢?
首先需要明白 static 这个 keyword 在类中的含义和它的用途,一般把与类相关的数据成员或成员函数声明为 static.
引用 <<c++ 经典问答>> 里的一个例子。
比如一个汽车工厂类:
静态成员就象位于工厂里的数据(生产汽车的数量),而不是工厂生产的对象(汽车)的数据。也就是说它反应的是工厂的生产指标。
- #include <iostream>
- using namespace std;
- class Car { // Car 类是生产 Car 对象的工厂
- public:
- Car() throw();
- static int num_; // 产量,Car 类相关数据
- private:
- int serial_; // 序号,Car 对象数据
- };
- Car::Car() throw()
- : serial_(num_)
- {
- cout << "Car ctor\n";
- ++num_;
- }
- int Car:: num_ = 0; // 类数据经常在 main() 之前自动出始化
- int main()
- {
- //
- cout << "Car::num_ = " << Car::num_ << '\n';
- {
- Car a; // Car 对象 a
- cout << "a.serial_ = " << a.serial_ << '\n';
- cout << "Car::num_ = " << Car::num_ << '\n';
- Car b; // Car 对象 b
- cout << "b.serial_ = " << b.serial_ << '\n';
- cout << "Car::num_ = " << Car::num_ << '\n';
- }
- cout << "Car::num_ = " << Car::num_ << '\n';
- }
复制代码
3>
class less_equal_value
{
public:
less_equal_value(int val): _val(val) { }
bool operator() (int val) { return val <= _val ; }
private:
int _val;
};
vector<int> vec;
count_if(vec.begin(), vec.end(),less_equal_value(25));
为什么less_equal_value(25)它是一个函数对象,而不是构造一个无名的类对象并用25初始化呢???
如何理解函数适配器,它与函数对象的关系又如何理解呢?
不懂。
4>
int ia[] = { 0,1,1,2,3,5,5,8};
vector<int> ivec(ia, ia+8), vres;
//下面将导致未定义的运行时刻行为,因为在vres中没有可用空间
unique_copy( ivec.begin(), ivec.end(), vres.begin());
策略:
//ok:unique_copy()现在髟vres.push_back()插入
unique_copy( ivec.begin(), ivec.end(), back_inserter(vres));
问题:为什么用vres.push_back()插入就会有空间去插入元素了呢?
根基所传递的参数不同,vector 类能调用不同的构造函数:
vector<int> ivec(ia, ia+8);
表示声明一个向量并同时初始化。
vector<int> ivec(8)
表示声明一个向量长度为 8。
而 vector<int> vres;
声明的却是一个空向量,调用的是默认的构造函数,不能用 unique_copy( ivec.begin(), ivec.end(), vres.begin()); 直接拷贝。
一般用 push_back() 或 pop_back 在尾部增减。
至于 push_bask() 为什么可以,当然是人为设计好的,如果有兴趣,可以拆开来看看它内部是如何实现内存分配的。
另外补充一下,Vector维护一个内存中的栈,以存放它的元素。当一个vector需要更多的内存时,它会分配一些;当它不再生存时,它会释放内存。这样的话,我们就不需要再关心vector中元素的内存分配和释放问题。
5>
C++为我们自定义五种迭代器.不知道对于我们来讲为什么需要知道这几种?它又不是具体的览嘈?,例如,我们不
会定义哪个迭代器是单向迭代器,哪个是随机迭代器吧?它们的提出只是为了具体的实现时(不是我们实现,是设
计者)能够使用要求最低的迭代器是吧.是这样理解的吗?
我们用 C 语言的时候,经常会实用到数组和链表,显然它们的实现不同,访问其中的元素方法很不相同,数组一般通过下标或数组名加偏移量来实现,而链表则是通过链结中包含的指向前一元素或后一元素的指针来实现。
C++ 标准库提供了许多有用的容器类,如 string ,vector, list 等,同样它们实现的不同。
比如我们设计一个 max() 函数,让它找出最大的元素。
很多时候我们可能需要让它具有泛型的特征,即能接受 string,又可以接受 vector 甚至 list,由于它们不同的结构,显然给设计带来了困难,为了对容器内元素的访问有个统一的界面,引入了 iterator(迭代器) 概念,它是在指针层面上的抽象。
至于 c++ stl 为我们提供了多达五种不同的 iterator,目的是为了程序设计师能在不同场合下选用。当然如果你觉得还不够,可以设计适合自己的 iterator。 |
|