| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3201 人关注过本帖, 6 人收藏
标题:C++学习笔记,已结束
只看楼主 加入收藏
naruto01
Rank: 4
等 级:业余侠客
帖 子:103
专家分:280
注 册:2011-5-23
结帖率:100%
收藏(6)
 问题点数:0 回复次数:40 
C++学习笔记,已结束
篇首:
    再过一个月大二就结束了,上的大专,所以就要被赶出去找工作。感到很迷茫,也很恐慌。在这两年里,图书馆里的书乱七八糟什么都看过,犯了贪多的毛病。想学习下Windows编程,但是很反感GDI那些东西;看完PHP,又不喜欢网页的表格、排版等,到头来什么也不会做。一个多月前,看到一个愿意培养新人的公司,希望在暑假前自学完C++,前去求职学习。
    刚才看了些牛人的博客,心里也很郁闷。感觉学习的进度为什么这么慢。心里告诉自己不要急躁。但,唉。从小到大,都不敢跟别人一样,在做事之前,都拍着胸脯打保证说没问题,趁着心里面的复杂感受,赶紧壮着胆注册了帐号,希望借本帖的小地方督促自己学习,怕自己半途而废,也免得我光看一遍,没有怎么实际练习过。

    本人状况:非计算机专业  熟悉C  能看懂点汇编  没有学习过数据结构  基本算法也都不知道
    使用教材:C++ Primer 中文版(第4版)

    更新安排:23号晚上开始跟帖更新,以后每日晚上更新,由于目前已经看到 顺序容器 9.3.7  所以在近两天,如果我们不补课的话,尽快把前面补上。(只剩一个月,有好多实验和实训,还要结课,所以有点忙)

    如果此贴违反相关规定,请版主在删帖之余,麻烦发个说明给我。谢谢。

[ 本帖最后由 naruto01 于 2011-7-3 17:34 编辑 ]
搜索更多相关主题的帖子: 找工作 Windows 博客 图书馆 网页 
2011-05-23 01:18
Toomj
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:257
专家分:1826
注 册:2011-5-17
收藏
得分:0 
楼主,帮你顶哈~~~~
2011-05-24 11:37
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:0 
呵呵,坚持是最难的。
2011-05-24 17:04
naruto01
Rank: 4
等 级:业余侠客
帖 子:103
专家分:280
注 册:2011-5-23
收藏
得分:0 
谢谢楼上两位的支持。我也知道坚持很不容易,所以才这样做。因为比较要面子,希望可以成为坚持下来的动力吧
昨天访问不了 现在补上昨天的笔记

程序代码:
2011.5.23
第一章    快速入门
    这一章让我见识了下C++程序是什么样子的,以及了解了一点非常重要的概念:类。大概看下,明白个大意就行了。
    在整个学习过程中,我比较注重对正确做法的理解或选择相对省事的做法,可能会省略掉一些关于错误行为的分析和解释。
    值得注意的有:
        1.C++中,每个表达式都产生一个结果。   输出操作(std::cout <<)返回值是输出流本身,输入流同样。
        2.命名空间(namespace)的概念。    在初级学习中,一般加上using namespace std;即可。
        3.从开始学习,就应该养成遵循规范的良好习惯。    比如#include <iostream>与C语言中的区别。
        4.在适当位置声明变量,更有助于规范程序思路。    比如for(int i = 1; i <= 10; ++i);

    就以最基本的一个C++程序来结束这一章的学习吧。
        //这是我的第一个C++程序
        //code by naruto01
        #include <iostream>
        int main()
        {
            for(int i = 1; i <= 10; ++i)
                if((i % 2) != 0)
                    std::cout << "Hello,World!" << std::endl;
            return 0;
        }
        
第二章    变量和基本类型
    本章介绍了C++变量和基本类型的相关内容,比较重要的有const限定符、引用、typedef以及类类型。
    2.1基本内置类型中,值得注意的是C++中把负值赋给unsigned对象是合法的,结果是该负数对2^n(n是该类型的存储位数)求模后的值。
    2.2字面值常量,有宽字符概念,即在字面值前面加L。 宽字符是一个字符用两个字节来存放。
    2.3变量
        注意“左值”和“右值”的概念。
            左值(lvalue)可以出现在赋值语句的左边或右边。
            右值(rvalue)只能在右边。
        C++中的标识符区分大小写。
        保持一致的命名习惯。
        在变量定义时指定了初始值,称为初始化。 要注意对未初始化的变量使用可能引起运行问题,所以最安全和容易的做法是对每个内置类型变量进行初始化。
        类通过构造函数进行初始化。
        变量名的作用域 http://learn.对作用域的解释很好理解
        引用使用&进行定义,并且必须初始化,不能定义引用的引用。
        typedef的使用目的:
            为了隐藏特定类型的实现,强调目的
            简化
            允许一种类型用于多个目的
        类在定义后面需要添加分号(;)。
            类中的操作和数据称为类的成员。
            访问标号这里介绍了有public、private。
            struct和class的唯一差别在于,class在没有访问标号时,任何成员都是private;struct则为public。    
        预处理时避免多重包含的技巧:
            #ifndef MY_MARK
            #define MY_MARK
            #endif
            
    一小段程序
        //myclass.h
        #ifndef MY_MARK
        #define MY_MARK
        #endif
        
        class my_class {
            public:
                std::string  str;
        };
        
        //主程序
        //code by naruto01
        #include <iostream>
        #include "myclass.h"

        typedef class my_class my_defed;

        int main()
        {
            my_defed test;
            std::string &ref = test.str;
            std::cin >> test.str;
            std::cout << "本体:" << test.str << std::endl;
            std::cout << "引用: " << ref << std::endl;
            return 0;
        }


[ 本帖最后由 naruto01 于 2011-5-24 19:56 编辑 ]
2011-05-24 19:07
紫凤双飞
Rank: 2
等 级:论坛游民
帖 子:76
专家分:61
注 册:2011-3-26
收藏
得分:0 
顶一个
2011-05-24 20:19
naruto01
Rank: 4
等 级:业余侠客
帖 子:103
专家分:280
注 册:2011-5-23
收藏
得分:0 
程序代码:
2011.5.24
第三章    标准库类型
    在头文件中,必须总是使用完全限定的标准库名字。
    string类型的输入操作符需要注意有两点:
        1.读取并忽略开头所有的空白字符。
        2.读取字符直至再次遇到空白字符终止。    
    使用getline读取整行文本,和上述特点配合,可以有效分解句子中的单词。例子将在IO操作看到。
    string对象size()操作返回的是string::size_type类型。    这表示应使用相关库类型的配套类型,它们的使用与机器无关,并可以减少错误发生。
    在3.2.3的6中,有一例子string s5 = s1 + ", " + "world";     s1 + ", "    返回string对象,然后再与"world"进行连接。也体现了第一章的描述:C++中,每个表达式都产生一个结果。
    string对象字符处理的相关函数定义在cctype头文件中。    cname表示这个头文件源自C标准库。
    
    vector是同一种类型的对象的集合。使用应包含#include <vector>。
    vector是一个类模版,而vector<int>则是数据类型。
    vector是可以动态增长的。    简直太爽了,C写程序时一直愁数组大小不能更改,如果想动起来,就得自己进行内存管理,很麻烦,难怪vector应用很普遍。
    C++程序员习惯优先选用!=进行循环判断条件。
    
    迭代器是一种检查容器内元素并遍历元素的数据类型。    可以想象成一种智能、自适应的特殊指针,这样对于迭代器的操作,对于熟悉C的人来说,更快理解。
    每种容器通过begin和end函数返回迭代器。其中begin指向第一个元素,而end返回的是“容器末端元素的下一个”。
    任何改变vector长度的操作都会使已存在的迭代器失效。    在使用迭代器的时候,要特别注意当前使用迭代器是否仍然有效,这是很容易被忽视导致的错误。
    
    bitset类型使直接操作若干位提供了方便。
    size_t类型定义在cstddef中,是一个与机器相关的unsigned类型,大小足以保证存储内存中对象的大小。    在一些程序的源代码中经常看到这个类型,后面数组的下标也应使用size_t。
    
    //code by naruto01
    #include <iostream>
    #include <string>
    #include <cctype>
    #include <vector>

    //这里啰嗦一次,以后using namespace std; 
    using std::cin;
    using std::cout;
    using std::endl;
    using std::string;
    using std::vector;

    int main()
    {
        string s;
        if(s.empty())
            cin >> s;
        s += " naruto01";
        cout << s << endl;
        //s转换成大写形式
        for(string::size_type ix = 0; ix != s.size(); ++ix)
            s[ix] = toupper(s[ix]);
        cout << s << endl;
    
        vector<int> ivec(12, 8);
        ivec.push_back(9);
        for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
            *iter = 6; 
      
        return 0;    
    }

第四章    数组和指针
    理解指针声明语句时,从右向左阅读方便理解。
    预处理器变量NULL在cstdlib头文件中定义。
    C++提供void*指针,只与地址值有关。
    注意区分指向const对象的指针(const int *p)、const指针(int *const p)、指向const对象的const指针(const int *const p)。    观察const修饰的对象有助于区分他们。
    在4.2.5中谈到指针和typedef给出一例:
        typedef string *pstring;
        const pstring cstr;
        其中cstr变量是什么类型?一般错误地认为是指向const string的指针是因为把typedef当作文本扩展。typedef定义了pstring是一个指针,所以const修饰指针。    这里提到并不是故意抠字眼,在编写代码中,应该尽可能帮助人理解代码意图,当然一些定义习惯还是应该学习的。
        
    C++提供了新的内存管理方法,new和delete。需要注意在new申请内存使用结束后,应及时delete进行释放。
        在释放数组时,应该的操作:delete [] pia;
        
    多维数组中,很容易搞混的就是“指针的数组”和“指向数组的指针”了。
        int (*p)[4];    //指向拥有4个int元素数组的指针(pointer to an array of 4 ints)    我感觉英文注释更直观,在此一并附上
        int *p[4];    //int指针的数组,有4个元素(array of pointers to int)
        小技巧:后缀运算符的优先级高于单目运算符,即优先级[] > *,所以先和谁结合,也就确实了是数组还是指针。    具体可以参考http://learn.
        
    这一章跟C基本没有什么差别,所以也就不再列程序了


[ 本帖最后由 naruto01 于 2011-5-24 21:53 编辑 ]
2011-05-24 21:49
Toomj
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:257
专家分:1826
注 册:2011-5-17
收藏
得分:0 
继续顶
2011-05-25 10:19
刘俊凯
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-5-25
收藏
得分:0 
hao
2011-05-25 10:21
donggegege
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:125
专家分:368
注 册:2011-5-1
收藏
得分:0 
慢慢啃书本吧,
2011-05-25 12:43
naruto01
Rank: 4
等 级:业余侠客
帖 子:103
专家分:280
注 册:2011-5-23
收藏
得分:0 
程序代码:
2011.5.25
第五章    表达式
    一般情况下,表达式的结果是右值。    int var; ++var; var++;    这里的两个表达式结果则为左值。
    在进行expr1 && expr2或者expr1 || expr2的判断时,会有“短路求值”,所以不能指望在一个逻辑判断表达式中,可以完成所有预期的操作。    大一看过《编程卓越之道 第二卷:运用底层语言思想编写高级语言代码》,在讲到短路求值时,好像意思是说不同的语言有不同的求值顺序。在C++ Primer中说到“总是先计算其左操作数,然后再计算其右操作数”。(中文版P132),应该仅指C++。
    
    位操作,不是循环移位,而是丢弃移出去的位,用0填充。
        原来在学习C语言过程中,就不是太注意。后来接触汇编,发现右移和左移代替一些乘除法的效率简直是惊人的,了解到补码这些概念后,在尝试把一段汇编代码翻译成C的时候,才意识到对“符号位”的操作存在空白。在P134中指出:“位操作符如何处理其操作数的符号位依赖于机器。”,最佳实践值得借鉴:“对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用unsigned整型操作数”。    
    
    复合赋值操作符,值得注意的是左操作数只计算了一次。    可能在一些小测试中,会用到这一点来坑害百姓哦。
    
    自增和自减操作符中,讲到了关于语言本身实现前置和后置操作的差别,前置操作更有效率。应该在没有差别时,优先使用前置操作。
    
    sizeof操作符返回的是一个对象或类型名的长度,单位是字节,返回值类型是size_t,编译时是常量。
    
    结合性中讲到的“左结合性”和“右结合性”。以前看书不是太肯定,这里尝试描述一下:从左到右就是左结合。
    
    不推荐死记硬背操作符的优先级,善于利用(),不过手边有一份优先级的表还是不错的选择。 ^ ^
    
    动态内存管理中,注意delete删除指针之后,该指针变成悬垂指针,应该及时将指针置0.
    
    类型转换中,有个const_cast,可以转换掉表达式的const性质,但书中提到,使用const_cast也总是预示着设计缺陷。
    
    
    本节不做程序为例。
    
第六章    语句
    在故意省略case后面的break语句是很罕见的,因此应该提供一些注释说明其逻辑。
    for循环语句,以前一直存在一个误区,以为必然会首先执行一次,类似do-while形式,其实是初始化语句(init-statement)结束后,求解判断条件(condition)。
    try/throw/catch在之前看的国内C教材,只在关键字中看到过,这里简单了解一下。主要有<stdexcept>中定义的若干标准异常类,定义了一个what的操作,没有任何参数,返回异常提供更详细的文字描述。
    
    预处理器调试时的常量:__FILE__    文件名、__LINE__    当前行号、__TIME__    文件被编译的时间、__DATE__    文件被编译的日期
    assert宏定义在cassert头文件,它的有效性取决于NDEBUG是否定义。使用assert来测试“不可能发生”的条件,如果assert宏求解条件表达式为false,则输出信息并且终止程序。
    
    对于异常处理这块,不是很感冒,所以也仅作了解。第一章程序已经使用了for、if,这里在此基础上仅仅简单地增加使用break。代码都会用到这几章的内容,是最普遍不过的基本组成部分了,所以也算是让自己好看点。多少复制点代码吧 - -#  唯一有价值的感觉就在注释的那句话。真不好意思。之后章节将只提供代码片段,重点快来咯。
    
    //code by naruto01
    #include <iostream>
    int main()
    {
        for(int i = 1; i <= 10; ++i)
            if((i % 2) != 0)
                std::cout << "Hello,World!" << std::endl;
            else if(7 == i)    //防止误写成i = 7的好办法
                        break;
        return 0;
    }    
2011-05-25 22:53
快速回复:C++学习笔记,已结束
数据加载中...
 
   



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

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