| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3201 人关注过本帖, 6 人收藏
标题:C++学习笔记,已结束
只看楼主 加入收藏
naruto01
Rank: 4
等 级:业余侠客
帖 子:103
专家分:280
注 册:2011-5-23
收藏
得分:0 
开始考试,我都还没复习。我不想最后一学期挂科啊~~~~~~  先停止C++。25号之后,再做计较

to bad_boy:数据结构的链表么? 数据结构书上都讲得很详细吧?我菜鸟。放过我
to plp313131:加油~不过现在别学我 - -# 连课本都看不进去。。
to 一点温柔:像一点温柔童鞋看齐!
收到的鲜花
2011-06-17 22:47
naruto01
Rank: 4
等 级:业余侠客
帖 子:103
专家分:280
注 册:2011-5-23
收藏
得分:0 
程序代码:
2011.7.3
第15章    面向对象编程
    面向对象编程(Object-oriented programmingm OOP)基于三个基本概念:数据抽象、继承和动态绑定。
    多态性,通过继承而相关联的类型为多态类型,是因为在许多情况下可以互换地使用派生类型或基类型的“许多形态”。
    在C++中,多态性仅用于通过继承而相关联的类型的引用或指针。
    在C++中,基类必须指出希望派生类重定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。
    在C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定。
    继承层次的根类一般都要定义虚析构函数即可。
    在非虚函数的调用在编译时确定。除了构造函数之外,任意非static成员函数都可以是虚函数,保留字virtual不能用在类定义体外部出现的函数定义上。
    protected成员可以被派生类对象访问但不能被该类型的普通用户访问。
    派生类只能通过派生类对象访问其基类的protected成员,派生类对其基类类型对象的protected成员没有特殊访问权限。
        提供给派生类型的接口是protected成员和public成员的组合。
    类派生列表指定了一个或多个基类。
        访问标号决定了对继承成员的(最大)访问权限。        这句话自己添加的不是很确切,主要是指继承成员的访问权限等于或严格于派生类的访问标号、
            如果想要继承基类的接口,则应该进行public派生。        经常见到的也是这种派生方式。
    派生类一般会重定义所继承的虚函数。
        如果派生类没有重定义,则使用基类中定义的版本。
    派生类必须对想要重定义的每个继承成员进行声明。
        派生类中虚函数的声明必须与基类中的定义方式完全匹配。    一个例外:返回对基类型的引用(或指针)的虚函数,派生类中的虚函数可以返回基类函数所返回类型的派生类的引用(或指针)。
        派生类重定义虚函数时,可以使用virtual,但不是必须这样做。
    
    已定义的类才可以用作基类。
        暗示着不可能从类自身派生出一个类。
    基类本身可以是一个派生类。
    如果需要声明(但并不实现)一个派生类,则声明包含类名但不包含派生列表。
    可将基类类型的引用绑定到派生类对象的基类部分,指针也是如此。        这里注意是基类的引用或指针可以绑定到派生类上,反之则不行。
    任何可以在基类对象上执行的操作也可以通过派生类对象使用。
    引用和指针的静态类型与动态类型可以不同,这是C++用以支持多态性的基石。        静态类型:static type, 在编译时可知的引用类型或指针类型。        动态类型:dynamic type, 指针或引用绑定的对象的类型,这是仅在运行时可知的)。
        如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数。
        只有通过引用或指针调用,虚函数才在运行时确定。
    非虚函数总是在编译时根据调用该函数的对象、引用或指针的类型而确定。
    只有成员函数中的代码才应该使用作用域操作符覆盖虚函数机制。
        最常见的理由是为了派生类虚函数调用基类的版本。
    通过基类的引用或指针调用虚函数时,默认实参为在基类虚函数声明中指定的值,如果通过派生类的指针或引用调用虚函数,则默认实参是在派生类的版本中声明的值。
    
    派生类可以进一步限制但不能放松对所继承的成员的访问。
    无论派生列表中是什么访问标号,所有继承Base的类对Base中的成员具有相同的访问。
    在继承层次的设计中,有一个重要概念:是一种(Is A) 有一个(Has A)
    为了使size在Derived中成为public,可以在Derived的public部分增加一个using声明:using Base::size; , 从而恢复继承成员的访问级别。
    私有继承相当罕见,所以如果确实需要,显式指定可避免误解。    struct派生则默认为public, class派生则默认为private。
    
    友元可以访问类的private和protected数据。
        友元关系不能继承。如果基类被授予友元关系,则只有基类具有特殊访问权限。
    
    每个static成员只有一个实例。
    确定派生类到基类转换的可访问性取决于在派生类的派生列表中指定的访问标号。
    从基类到派生类的自动转换是不存在的。        如果确定可以,需要使用static_case强制转换。
    
    构造函数和复制控制成员不能继承。
    派生类构造函数的初始化列表只能初始化派生类的成员,不能直接初始化继承成员。
        可以将基类包含在构造函数初始化列表中间接初始化。
        class Bulk_item : public Item_base {
        public:
            Bulk_item(const std::string& book, double sales_price, 
                                std::size_t qty = , double disc_rate = 0.0) :
                                Item_base(book, sales_price),
                                min_qty(qty), discount(disc_rate) { }
        };
    一个类只能初始化自己的直接基类。        直接基类就是在派生列表中指定的类。
    派生类应通过使用基类构造函数尊重基类的初始化意图。
    
    具有指针成员的类一般需要定义自己的复制控制来管理成员。
    派生类析构函数不负责撤销基类对象的成员。
    基类中的析构函数必须是虚函数。
        即使析构函数没有工作要做,继承层次的根类也应该定义一个虚析构函数。
        强调之前,虚函数必须在基类和派生类中具有相同的形参。
    
    在继承情况下,派生类的作用域嵌套在基类作用域中。
    与基类成员同名的派生类成员将屏蔽对基类成员的直接访问。
        可以使用作用域操作符来访问被屏蔽的基类成员。
        设计派生类时,只要可能,最好避免与基类成员的名字冲突。
    在派生类作用域中派生类成员屏蔽基类成员,即使函数原型不同,基类成员也会被屏蔽。
    
    成员函数(无论虚还是非虚)可以重载。
        如果派生类重定义了重载函数,则通过派生类型只能访问派生类中重定义的那些成员。
        派生类不用重定义所继承的每一个基类版本,可以为重载成员提供using声明,一个using声明只能指定一个名字。
    通过基类类型的引用或指针调用函数时,编译器将在基类中查找该函数而忽略派生类。
    
    在函数形参表后面写上=0以指定纯虚函数。
        含有(或继承)一个或多个纯虚函数的类是抽象基类(Abstract base class)。
        不能创建抽象类型的对象。
        
    后面关于指针或引用管理的内容跳过。
    
第16章    模板与泛型编程
    这一章之所以阅读的主要原因在于看一位大牛的网站,他写的数据结构学习笔记,一直使用template的东西,简单阅读这一章,做到可以看懂代码即可,所以仅做了解。
    
    泛型编程就是以独立于任何特定类型的方式编写代码。
    模板是泛型编程的基础。
    函数模板是一个独立于类型的函数。
        template <typename T>
        int compare(const T &v1, const T &v2)
        {
            if (v1 < v2) return -1;
            if (v2 < v1) return 1;
            return 0;
        }
    inline函数模板,需要注意inline的位置:
        template <typename T> inline T min(const T&, const T&);
    
    书上16.1.2中,又一次提醒了关于重载条件的复习,详见P378.
    
    模板形参遵循常规名字屏蔽规则。与全局作用域中声明的对象、函数或类型同名的模板形参会屏蔽全局名字。
    每个非类型形参前面必须带上类型名字,省略关键字或类型说明符是错误的:
        template <typename T, U> T calc (const T&, const U&);
        改正为:template <typename T, typename U> T calc (const T&, const U&);
    typename显式指明一个名字是一个类型。所以在类型之前指定typename没有害处。
    在调用函数时非类型形参将用值代替,值的类型在模板形参表中指定。
        这里书上例子,很能说明问题:
            template <class T, size_t N> void array_init(T (&parm)[N])
            {
                for (size_t i = 0; i != N; ++i) {
                    parm[i] = 0;
                }
            }
            
            编译器从数组实参计算非类型形参的值:
            int x[42];
            double y[10];
            array_init(x);    // 实例化为array_init(int(&)[42])                            因为后面不再继续写了,所以这里提一下实例化的概念:产生模板的特定类型实例的过程称为实例化。
            array_init(y);    // 实例化为array_init(double(&)[10])
            对模板的非类型形参而言,求值结果相同的表达式将认为是等价的。调用的是相同的实例——array_init<int, 42>:
            int x[42];
            const int sz = 40;
            int y[sz + 2];
            array_init(x);
            array_init(y);
    
    编写泛型代码的两个重要原则:
        模板的形参是const引用。
        函数体中的测试只用<比较。        在本章笔记开头的代码就体现了这种优势。
            详细的原因,参见P534-P535
2011-07-03 17:31
naruto01
Rank: 4
等 级:业余侠客
帖 子:103
专家分:280
注 册:2011-5-23
收藏
得分:0 
本次对C++的正式初探算是告一段落。离真正掌握还差的很远,希望自己可以坚持不懈!
另外谢谢您的关注。
祝我们好运~
2011-07-03 17:34
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
看楼主发的帖子,亦深有体会,觉得学这东西,还是慢慢来,学这东西真是急不得,急了效果反而不太好,好像在这曾看过一个帖子,说看一本书不在于你看完了没有,看完了没什么,关键是你学会了多少,祝楼主好运啊,大家一起坚持啊
2011-07-03 18:55
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
LZ有时间还是看下数据结构吧,这东西很重要。若在公司用纯C++,那你不学界面也行,但在windows下搞编程的话还是了解下他的东西好。汇编那玩意估计会很少用到,自己调试程序还行。看书的话你可以自己总结一些东西,精简书上的内容或自己的看法,记录下来。以后必定会有用。需要学的东西还很多。

离恨恰如春草,更行更远还生。
2011-07-03 20:26
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
回复 35楼 玩出来的代码
之前看过一点数据结构,看到树和图那里一大堆递归的东西,感觉递归那东西看着容易,动手起来有难度,所以有点吃不消,个人感觉递归在数据结构中蛮重要的,尽管知道是栈的机制,还是不会,不知道玩出来的代码有没有比较好的学习这东西的方法,或给个例子说明下,请教
2011-07-03 21:11
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:0 
恩,递归是挺重要的,树和图用递归的也多,不过这可不是栈的机制,栈就是个先进先出,你可以找算法一类的书看看,算法书上都有讲解递归的。要理解递归就将他的每一步都搞清楚,单步看他每一次递归后的数据变化,这只是了解递归的过程,实际用递归时只需考虑临界条件,也就是递归出口,细节就不用考虑了。应用递归的如八皇后、排列组合、斐波那契额数列、整数分解、树图等。或许不是好的算法,这些例子都可以很好的理解递归。
说起递归也想起以前看过的一个比较牛的递归程序。
程序代码:
#include<stdio.h>
int p(int i,int N)
{
    return printf("%d\n",i) && (N>i) && ( p(i+1,N) || p(i,i) );
}
int main()
{
    p(1,9);
    return 0;
}

这个程序如能不执行就知道它的结果,那也很牛了。

离恨恰如春草,更行更远还生。
2011-07-03 22:09
naruto01
Rank: 4
等 级:业余侠客
帖 子:103
专家分:280
注 册:2011-5-23
收藏
得分:0 
to 玩出来的代码:您说的对我很有帮助。   我也曾经拿起过一些数据结构的书本进行学习,但是在一些内容上存在障碍,所以也不是特别积极。 正准备打算拜读Weiss的大作,不过又想想,还是踏实点,先系统学习下离散数学吧。 我这人比较注重理解,不喜欢记忆,也不是很赞同有人说理解了自然就记住了。这个问题取决了一些个人其他的因素,所以我还是比较尊重自己,learning by doing。如果我能够找到一些我想要真正实现的东西,我相信自然这些枯燥的东西会立刻容光散发的。   
    同样我想多说点的,编程在我的理解还是以解决自己需求为主要目的才能够真正给我带来乐趣。迄今为止,可以说编程让我感到唯一的愉快体验就是打麻将没有色子,简单地用个伪随机数来仿真,正像MIT的公开课程《计算机科学及编程导论》开篇引导学生的那样。我想学习编程,首先需要想清楚到底想用编程干什么?这也是我现在仍然在思考的问题,它可能会浪费一些时间,或者让自己有点不知所措,但是这个问题会伴随自己的编程生命,也是编程的主要理由和动力。
    谢谢您的指教,同样很巧,我们是老乡。
to specilize:呵呵~一起加油
2011-07-03 23:27
摇滚乐园
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-7-5
收藏
得分:0 
谢谢你
2011-07-05 03:04
噼里啪啦
Rank: 2
等 级:论坛游民
帖 子:34
专家分:11
注 册:2011-7-8
收藏
得分:0 
加油!~~!!
2011-07-08 23:50
快速回复:C++学习笔记,已结束
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022606 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved