精华内容
下载资源
问答
  • 高效C++指南高效C++指南高效C++指南高效C++指南高效C++指南
  • 高质量c/c++指南面试题

    千次阅读 2012-02-28 15:40:22
    这两天又看c++,回学校后,发现我做的面试题竟是林锐《高质量c/c++指南》,98%相同。更发现林锐同志在序言说大部分面试的硕士,研究生不及格,有半数以上得零分,我心中 一惊,难道中国学生竟如此之差。我因为此...

       这两天又看c++,回学校后,发现我做的面试题乃是林锐《高质量c/c++指南》,98%相同。更发现林锐在序言说大部分面试的硕士,研究生不及格,有半数以上得零分,我心中 一惊,难道中国学生竟如此之差。我因为此试题离开北京。先公布于下 ;

     

    附录B :C++/C试题

    本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。

    笔试时间90分钟。请考生认真答题,切勿轻视。

    一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)

    提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为:

        if ( n == 0 )

        if ( n != 0 )

    以此类推。

    请写出 BOOL  flag 与“零值”比较的 if 语句:

    请写出 float  x 与“零值”比较的 if 语句:

    请写出 char  *p 与“零值”比较的 if 语句:

    二、以下为Windows NT下的32C++程序,请计算sizeof的值(10分)

    char  str[] = “Hello” ;

    char   *p = str ;

    int     n = 10;

    请计算

    sizeof (str ) =        

             

    sizeof ( p ) =        

              

    sizeof ( n ) =

    void Func ( char str[100])

    {

    请计算

     sizeof( str ) =    

    }

    void *p = malloc( 100 );

    请计算

    sizeof ( p ) =

    三、简答题(25分)

    1、头文件中的 ifndef/define/endif 干什么用?

    2#include  <filename.h>   和  #include  “filename.h” 有什么区别?

    3const 有什么用途?(请至少说明两种)

    4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?

    5、请简述以下两个for循环的优缺点

    // 第一个

    for (i=0; i<N; i++)

    {

    if (condition)

        DoSomething();

    else

        DoOtherthing();

    }

    // 第二个

    if (condition)

    {

    for (i=0; i<N; i++)

        DoSomething();

    }

    else

    {

        for (i=0; i<N; i++)

        DoOtherthing();

    }

    优点:

    缺点:

    优点:

    缺点:

    四、有关内存的思考题(20分)

    void GetMemory(char *p)

    {

    p = (char *)malloc(100);

    }

    void Test(void) 

    {

    char *str = NULL;

    GetMemory(str);

    strcpy(str, "hello world");

    printf(str);

    }

    请问运行Test函数会有什么样的结果?

    答:

    char *GetMemory(void)

    {

    char p[] = "hello world";

    return p;

    }

    void Test(void)

    {

    char *str = NULL;

    str = GetMemory();

    printf(str);

    }

    请问运行Test函数会有什么样的结果?

    答:

    Void GetMemory2(char **p, int num)

    {

    *p = (char *)malloc(num);

    }

    void Test(void)

    {

    char *str = NULL;

    GetMemory(&str, 100);

    strcpy(str, "hello");

    printf(str);

    }

    请问运行Test函数会有什么样的结果?

    答:

    void Test(void)

    {

    char *str = (char *) malloc(100);

    strcpy(str, hello);

    free(str);     

    if(str != NULL)

    {

      strcpy(str, world);

    printf(str);

    }

    }

    请问运行Test函数会有什么样的结果?

    答:

    五、编写strcpy函数(10分)

    已知strcpy函数的原型是

    char *strcpy(char *strDest, const char *strSrc);

    其中strDest是目的字符串,strSrc是源字符串。

    1)不调用C++/C的字符串库函数,请编写函数 strcpy

    2strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?

    六、编写类String的构造函数、析构函数和赋值函数(25分)

    已知类String的原型为:

    class String

    {

      public:

    String(const char *str = NULL); // 普通构造函数

    String(const String &other);     // 拷贝构造函数

    ~ String(void);     // 析构函数

    String & operate =(const String &other); // 赋值函数

      private:

    char   *m_data; // 用于保存字符串

    };

    请编写String的上述4个函数。

    附录C :C++/C试题的答案与评分标准

    一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)

    请写出 BOOL  flag 与“零值”比较的 if 语句。(3分)

    标准答案:

        if ( flag )

        if ( !flag )

    如下写法均属不良风格,不得分。

    if (flag == TRUE)

    if (flag == 1 )

    if (flag == FALSE)  

        if (flag == 0)

    请写出 float  x 与“零值”比较的 if 语句。(4分)

    标准答案示例:

    const float EPSINON = 0.00001;

    if ((x >= - EPSINON) && (x <= EPSINON)

    不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。

       

    如下是错误的写法,不得分。

    if (x == 0.0)

    if (x != 0.0)

    请写出 char  *p 与“零值”比较的 if 语句。(3分)

    标准答案:

        if (p == NULL)

        if (p != NULL)

    如下写法均属不良风格,不得分。

    if (p == 0)

    if (p != 0)

    if (p)  

        if (!)

    二、以下为Windows NT下的32C++程序,请计算sizeof的值(10分)

    char  str[] = “Hello” ;

    char   *p = str ;

    int     n = 10;

    请计算

    sizeof (str ) =  6   (2分) 

             

    sizeof ( p ) =   4   (2分)

              

    sizeof ( n ) =   4   (2分)

    void Func ( char str[100])

    {

    请计算

     sizeof( str ) =   4     (2分)

    }

    void *p = malloc( 100 );

    请计算

    sizeof ( p ) =  4      (2分)

    三、简答题(25分)

    1、头文件中的 ifndef/define/endif 干什么用?(5分)

    答:防止该头文件被重复引用。

    2#include  <filename.h>   和  #include  “filename.h” 有什么区别?(5分)

    答:对于#include  <filename.h> ,编译器从标准库路径开始搜索 filename.h

        对于#include  “filename.h” ,编译器从用户的工作路径开始搜索 filename.h

    3const 有什么用途?(请至少说明两种)(5分)

    答:(1)可以定义 const 常量

    2const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

    4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”? (5分)

    答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y);

    该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。

    C++提供了C连接交换指定符号externC”来解决名字匹配问题。

    5、请简述以下两个for循环的优缺点(5分)

    for (i=0; i<N; i++)

    {

    if (condition)

        DoSomething();

    else

        DoOtherthing();

    }

    if (condition)

    {

    for (i=0; i<N; i++)

        DoSomething();

    }

    else

    {

        for (i=0; i<N; i++)

        DoOtherthing();

    }

    优点:程序简洁

    缺点:多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。

    优点:循环的效率高

    缺点:程序不简洁

    四、有关内存的思考题(每小题5分,共20分)

    void GetMemory(char *p)

    {

    p = (char *)malloc(100);

    }

    void Test(void) 

    {

    char *str = NULL;

    GetMemory(str);

    strcpy(str, "hello world");

    printf(str);

    }

    请问运行Test函数会有什么样的结果?

    答:程序崩溃。

    因为GetMemory并不能传递动态内存,

    Test函数中的 str一直都是 NULL。

    strcpy(str, "hello world");将使程序崩溃。

    char *GetMemory(void)

    {

    char p[] = "hello world";

    return p;

    }

    void Test(void)

    {

    char *str = NULL;

    str = GetMemory();

    printf(str);

    }

    请问运行Test函数会有什么样的结果?

    答:可能是乱码。

    因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。

    void GetMemory2(char **p, int num)

    {

    *p = (char *)malloc(num);

    }

    void Test(void)

    {

    char *str = NULL;

    GetMemory(&str, 100);

    strcpy(str, "hello");

    printf(str);

    }

    请问运行Test函数会有什么样的结果?

    答:

    1)能够输出hello

    2)内存泄漏

    void Test(void)

    {

    char *str = (char *) malloc(100);

    strcpy(str, hello);

    free(str);     

    if(str != NULL)

    {

      strcpy(str, world);

    printf(str);

    }

    }

    请问运行Test函数会有什么样的结果?

    答:篡改动态内存区的内容,后果难以预料,非常危险。

    因为free(str);之后,str成为野指针,

    if(str != NULL)语句不起作用。

    五、编写strcpy函数(10分)

    已知strcpy函数的原型是

    char *strcpy(char *strDest, const char *strSrc);

    其中strDest是目的字符串,strSrc是源字符串。

    1)不调用C++/C的字符串库函数,请编写函数 strcpy

    char *strcpy(char *strDest, const char *strSrc);

    {

        assert((strDest!=NULL) && (strSrc !=NULL)); // 2分

        char *address = strDest; // 2分

        while( (*strDest++ = * strSrc++) != \0’ ) // 2分

           NULL ; 

        return address ; // 2分

    }

    2strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?

    答:为了实现链式表达式。 // 2分

    例如 int length = strlen( strcpy( strDest, “hello world”) );

    六、编写类String的构造函数、析构函数和赋值函数(25分)

    已知类String的原型为:

    class String

    {

      public:

    String(const char *str = NULL); // 普通构造函数

    String(const String &other);     // 拷贝构造函数

    ~ String(void);     // 析构函数

    String & operate =(const String &other); // 赋值函数

      private:

    char   *m_data; // 用于保存字符串

    };

    请编写String的上述4个函数。

    标准答案:

    // String的析构函数

    String::~String(void)               // 3分

    {

    delete [] m_data;                      

    // 由于m_data是内部数据类型,也可以写成 delete m_data;

    }

    // String的普通构造函数             

    String::String(const char *str)      // 6分

    {

    if(str==NULL)                          

    {

    m_data = new char[1];    // 若能加 NULL 判断则更好

    *m_data = \0;                      

    }                                        

    else

    {

    int length = strlen(str);           

    m_data = new char[length+1];  // 若能加 NULL 判断则更好      

    strcpy(m_data, str);                

    }

    }

    // 拷贝构造函数

    String::String(const String &other)   // 3分

    {

    int length = strlen(other.m_data);  

    m_data = new char[length+1];      // 若能加 NULL 判断则更好    

    strcpy(m_data, other.m_data);         

    }

    // 赋值函数

    String & String::operate =(const String &other)    // 13分

    {

    // (1) 检查自赋值                     // 4分

    if(this == &other)

    return *this;

    // (2) 释放原有的内存资源            // 3分

    delete [] m_data;

    // (3)分配新的内存资源,并复制内容 // 3分

    int length = strlen(other.m_data);

    m_data = new char[length+1];         // 若能加 NULL 判断则更好

    strcpy(m_data, other.m_data);

    // (4)返回本对象的引用            // 3分

    return *this;

    }

    因为这份面试题,本人惨败而归,写到这里,希望大家引起注意,好好学习

     

    展开全文
  • 高质量C++编程指南高质量C++编程指南高质量C++编程指南高质量C++编程指南高质量C++编程指南高质量C++编程指南高质量C++编程指南高质量C++编程指南
  • 一门初级、从入门到精通的C语言C++语法教程,由毕业于清华大学的业内人士执课。从简单的HelloWorld入门程序,到深入的C语言C++核心概念,均为您娓娓道来,言之必详、听之必懂。让C语言C++编程变得简单,让C语言C++...
  • C、C++编程指南.rarC、C++编程指南.rarC、C++编程指南.rar
  • C++编程指南

    千人学习 2018-12-17 11:26:59
    C++编程指南:趣味C++编程,使用边学边练的教学模式,以生动形象的语言来展示面向对象编程的魅力,带你掌握C++语言中类、对象、运算符重载、继承、多态等面向对象的程序设计方法,以及模板、标准模板库STL等泛型程序...
  • c++风格指南

    2018-09-26 14:56:40
    c++style指南 参考[google c++风格指南]https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/ 代码示例 #ifndef PROJECT_PATH_FILE_H #define PROJECT_PATH_FILE_H // 源文件中...

    c++style指南

    参考[google c++风格指南]https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/

    代码示例

    #ifndef PROJECT_PATH_FILE_H_
    #define PROJECT_PATH_FILE_H_
    
    /*
    # copyright 2018 HeWei, all rights reserved.  // 版权声明
    */
    
    // 源文件中首先包含对应头文件
    // #include "对应头文件" 
    
    #include <c标准头文件>
    
    #include <c++标准头文件>
    
    #include "依赖库头文件"
    
    #include "本项目头文件"
    
    // 避免直接使用using namespace foo;
    using std::string;
    using foo::bar;
    
    namespace ns {
    extern Type g_var; // 全局变量加g_前缀
    
    typedef struct point_s {
        int x;
        int y;
    } point_t;
    
    class LoginInterface {
        virtual int Login() = 0;
        virtual int Logout() = 0;
    };
    
    class ClassName {
     public:  // public protected private 修饰符空一个字符
        enum ContentType {
            UNKOWN = 0,
            TEXT_XML,
            TEXT_JSON,
            X_WWW_FORM_URLENCODED,
        };
        
        ClassName();
        ~ClassName();
        ClassName(ClassName& rhs)
        ClassName& operator=(ClassName& rhs);
        
        string Username() const {
            return _username;
        }
        
        void SetUsername(string username) {
            _username = username;
        }
        
        // 静态成员函数
        static void Init();
        static void DeInit();
        
        // public函数我们推荐使用大驼峰法,和golang一致
        int Login();
        int Logout();
        
     protected:
        // protected,private函数使用小驼峰法
        int encrypt();
        int decrypt();
    
     public:
        static bool s_bInit; // 静态变量加s_前缀
        string _username; // public变量加_前缀,以和局部变量区分
     protected:
        string password_; // protected,private变量加_后缀
        Button btnLogin;  // 强调类型可以使用匈牙利命名法
    };
    } // namespace ns
    
    #endif // PROJECT_PATH_FILE_H
    
    if (expr) {
        ...
    } else {
        ...
    }
    
    switch (var) {
    case C1: {
    }
    break;
    case C2: {
    }
    break;
    default: {
    }
    break;
    }
    
    for (int i = 0; i < 10; ++i) {
        ...
    }
    
    x*y + x/y
    
    • 头文件使用#define防止重复包含,而不是MSVC下的#pragam once;
    • 头文件包含顺序
      • 对应头文件
      • c系统头文件
      • c++系统头文件
      • 依赖库头文件
      • 本项目头文件
    • 禁止使用using namespace foo;,而应使用using foo:bar;;
    • 命名风格推荐
      • 文件名用全小写下划线法;
      • 宏定义、枚举值用全大写下划线法;
      • 变量名用全小写下划线法;
      • 类名、枚举名、类成员函数用驼峰法,采用golang大写可见,小写不可见规则;
      • 全局变量加g_前缀,静态变量加s_前缀,成员变量public加_前缀,protected、private加_后缀;
      • 强调类型可适当使用匈牙利命名法;
      • 纯数据成员使用struct,有函数成员的使用class;
      • 构造和析构函数中禁止使用虚函数;
      • 构造和析构函数中有错误返回的应额外定义Init和Deinit函数;
      • 只使用public继承,其它考虑组合;
      • 纯虚函数接口类习惯以Interface为后缀;
      • 尽量减少继承层数;
      • 尽量避免多重继承;
    • 函数
      • 参数传递方式:原生入参传值,对象入参传const引用,出参传指针;形如RetType func(int n, const T& in, T* out);
      • 总是做入参检查;
      • 函数体不宜过大;
      • 习惯返回0表示成功,其他错误码;
    • 合理使用空格和空行;
    • 用空格代替tab,习惯使用4空格缩进;
    • 习惯使用const
    • 零值:整型用0,浮点型用0.0,字符用’\0’,指针用NULL或者nullptr(c++11)
    • 尽量延迟声明变量,减小作用域,并且总是初始化;
    • 循环语句中的对象应在循环体外声明,以减少构造和析构造成的性能损失;
    • 禁止使用异常和友元语法;
    • 鼓励使用智能指针,以减少内存管理负担;
    • 前置自增,自减操作符效率更高;
    • 使用原生类型,而非WORD,DWORD之类;

    具体可使用cpplint.py进行代码风格检查

    展开全文
  • 高质量C++编程指南

    2011-10-12 16:55:07
    高质量C++编程指南高质量C++编程指南高质量C++编程指南高质量C++编程指南高质量C++编程指南高质量C++编程指南高质量C++编程指南高质量C++编程指南
  • Google C++编程风格指南

    2017-11-13 21:32:00
    Google C++编程风格指南 Google C++编程风格指南Google C++编程风格指南Google C++编程风格指南 Google C++编程风格指南Google C++编程风格指南
  • C++核心指南

    千次阅读 2016-10-29 18:23:25
    转: [Github项目]C++核心指南摘要: C++11和C++14到来,背后一定带来了新的设计哲学,新的解决C++问题的思路。https://github.com/isocpp/CppCoreGuidelines是一个很好的指引。 C++作为一门多范型的语言,有灵活性。...

    转: [Github项目]C++核心指南

    摘要: C++11和C++14到来,背后一定带来了新的设计哲学,新的解决C++问题的思路。https://github.com/isocpp/CppCoreGuidelines是一个很好的指引。
    C++作为一门多范型的语言,有灵活性。再加上C++的一些技巧,一些坑,很多公司都有自己的C++编码规范。这些规范一般都是建议什么该用,什么不该用,怎么去命名之类。没有提纲挈领地给出一个完整的规则体系。现在有了一些进展,Bjarne Stroustrup和Herb Sutter两位大神,在Github上发起了一个名为C++核心指南(C++ Core Guidelines)的项目。项目地址:https://github.com/isocpp/CppCoreGuidelines

    C++核心指南目的是帮助大家高效地使用现代Modern C++。这里的Modern C++不是《Modern C++ Design》这本书,而是指C++11和C++14(包括马上到来的C++17)。C++1x代表了C++快速发展的新时期,很多借鉴自其它语言的特性已经让C++有很大的变化。这些新特性还有待工程部门的使用验证。

    C++核心指南想C++的使用规则分为两个层面:高级层面和低级层面。高级层面涉及的是接口、资源管理、并发等,高级层面的规则会影响应用的结构和库的设计。遵循高级层面的规则,能够让代码静态类型安全,没有资源泄露,能够避免大部分编码中的逻辑错误。高级层面的规则是针对人。低级层面的规则则描述地是编码细节,比如命名规则,保证初始化,这部分规则主要针对的是工具,静态检查分析工具能够检测出代码是否违背了低级规则。C++核心指南将重心放在了高级层面的规则上。

    C++核心指南囊括了下面的内容:

    P: Philosophy

    I: Interfaces

    F: Functions

    C: Classes and class hierarchies

    Enum: Enumerations

    ES: Expressions and statements

    E: Error handling

    R: Resource management

    T: Templates and generic programming

    CP: Concurrency

    SL: The Standard library

    SF: Source files

    CPL: C-style programming

    PRO: Profiles

    GSL: Guideline support library

    FAQ: Answers to frequently asked questions

    C++核心指南提到的设计哲学:

    P.1: Express ideas directly in code

    P.2: Write in ISO Standard C++

    P.3: Express intent

    P.4: Ideally, a program should be statically type safe

    P.5: Prefer compile-time checking to run-time checking

    P.6: What cannot be checked at compile time should be checkable at run time

    P.7: Catch run-time errors early

    P.8: Don’t leak any resource

    P.9: Don’t waste time or space

    有兴趣的可以去读一读,最好还有人能翻译成中文分享给大家。

    展开全文
  • C++学习指南

    千次阅读 多人点赞 2016-07-06 07:11:06
    C++ 是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它……

    C++ 是一门古老而复杂的语言,绝不是一门可以速成的语言,学习它需要有意识的刻意练习和长时间的持续不断的磨练。而大多数人不太能耐得住寂寞,喜欢速成,所以像《 21 天学通 C++ 》这种书就比较受欢迎,卖得很好。通常那些干了一两年就说自己熟悉(甚至精通) C++ 的程序员只能算是轻浮的。

    Linux 之父 Linus 就曾说:“ C++ 是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它”。

    所以,要学习 C++ 并打算将其作为自己的首选编程语言,就要做好吃十年寒窗苦的准备,要耐得住寂寞,经得起考验,最终才能举重若轻,有所成就。

    也正因为此,很多人不大愿意学习 C++,还会找一些理由,比如 C++ 没落了、应用前景不广泛了作为理由。

    其实 C++ 仍然在不断发展,生命力依然旺盛,有大量的行业和不计其数的应用正在源源不断地引入 C++ 语言,它的前景依然看好。

    接下来我们要讨论下列主题:

    • C++ 语言的现状
    • 如何学习 C++

    C++语言的现状

    2015 年 TIOBE 的编程语言排行榜,C++ 位列第三。

    Stack Overflow 2015 年的开发者调查结果中有一项是“最受欢迎的技术”,C++ 排名第七,而在最被爱的语言中,C++11 排名第二(仅次于 Swift)。

    各种数据表明,C++ 语言依然广受欢迎和热爱。这就是它的现状。

    有机构通过分析与 C++ 语言相关的招聘信息得出的结果,使用 C++ 语言的前三个行业是:金融、银行和游戏。接下来是:Front Office、通信、电子、投行、市场、制造业、零售业。

    如果你想成为开发工程师并喜欢上述行业,学习 C++ 是不错的选择。

    现在很多人还在使用 C++98(这个标准距今20年了),而 C++ 标准委员会已经在准备 C++17 。较新的标准 C++11 正在普及,主流的编译器如 GCC 、 VS 、 Clang 的最新版本也都较为完整的支持了 C++11 ,加上追求卓越的 C++ 程序员主动在产品开发中引入 C++11 , C++ 的潜能得到了很大的发挥。

    如何学习 C++ 语言

    我始终认为要系统学习一门语言,最好是跟着一本书边学边练习,快速掌握这门语言的语法和基础特性,然后就可以找小项目练手,练一练再回头来看书,往复循环,不断加深理解,慢慢就能掌握到位。

    学习 C++ 语言最好的教程,是 C++ 之父 Bjarne Stroustrup 亲自撰写的 《The C++ Programming Language (4th Edition)》,支持 C++11 ,机械工业出版社有英文原版,分两本,第一本讲 1~3 部分, C++ 语言的基础内容,第二本是专讲第 4 部分, C++ 标准库。

    另外还有两本书,也是学习 C++ 语言的很好选择,《C++ Primer Plus(6th Edition)》和《The C++ Standard Library: A Tutorial and Reference (2nd Edition)》,也都支持 C++11 。

    需要注意的是,选择(设计)练习项目时,最好能结合当前的学习进度,让自己能够完成,收获正向反馈,激励自己不断前进。只有持续的正向激励,才能让一个人顺畅的完成 C++ 语言的学习。所以,一系列良好的练习项目很重要,既不能难度太低(没有成就感),也不可难度太高(会有挫败感),稍稍付出努力就能完成是最理想的。

    一旦完成了基础语言的学习和一系列练习项目,对语言有了一些感知,就可以参与到复杂度较大的项目中来磨练自己。最好是能结合自己的工作与生活,做一些自己感兴趣的项目,兴趣是最好的老师和最强的动力,如果做的东西感兴趣,就很容易钻进去,学下来。

    接下来我们聊聊成为一个能实战的 C++ 程序员都会经历的那些事儿:

    • IDE 选择
    • C++ 语言
    • 系统调用
    • 第三方类库

    简要来说说吧。

    IDE 选择

    我比较喜欢的选择是 Qt Creator(注意下载 Qt SDK 时选择 mingw 版本,其中自带 gcc 编译工具链)。而且这个选择是跨平台的,也可以在 Linux 、 Mac OS X上使用。

    Windows 下还有一个不错的选择—— VS 2013或更高版本,对 C++11 支持还算不错(不如 gcc )。

    C++ 语言的学习

    结合 C++ 的知识图谱,对 C++ 语言的学习,建议顺序是这样的:

    1. 基础语言
    2. 类与面向对象
    3. 输入输出
    4. 字符串处理(类库和正则表达式)
    5. 容器类库
    6. 泛型算法
    7. 多线程
    8. 原子操作

    大概过一下知识点,具体可以参考知识图谱。孟岩有一篇名为“快速掌握一个语言最常用的50%”的文章,有很强的参考意义,值得一读。对于 C++ 语言来讲,快速熟悉1、2、3、4、5这几部分,就可以动手做一些好玩的小程序了。

    • 基础语言

    这部分要了解 C++ 语言的基本数据类型、比如 int 、 char 、 bool 、 unsigned int 、 long 、 float 、 double 、 、 long long 、 enum 、 union 等等。能理解指针、引用等概念。

    掌握基本的编程语法,比如表达式、运算符、函数等。关于函数,多说两句,C++ 里有函数对象,在标准库里广泛应用,需要了解;另外 C++11 支持 lambda 表达式(匿名函数),威力强大,建议学习。不过这两点可以稍往后放放。

    主要的语言结构,比如 if-else 、 for 、 switch-case 、 while 、 do-while等。

    • 类与面向对象

    了解 class 的概念,了解继承、虚函数、重载、重写、多态、纯虚函数、多重继承等概念,它们是面向对象编程在语言层面的基础。

    面向对象更重要的是思想,很多 C 系程序员一直都在用类来写过程式程序。

    • 输入输出

    要做编程练习,了解基本的输入输出操作是必须的。

    C++ 里输入输出分 C 和 C++ 两部分。C 风格的 printf 系列函数、 FILE 、 fopen 、 fread 、 fwrite 等等或 C++ 风格的 istream 、 ostream 、 iostream 、 ifstream 、 ofstream 、 fstream等都可以完成输入输出操作 。

    • 字符串处理

    字符串处理是我们编程时使用频率最高的,C++ 里有 C 风格的字符串库,比如 strcmp 、 strcpy 、 strstr 、 strchr 等函数,也有更为方便和智能的字符串类,如 string 、 wstring 等,看看 API ,练习一下就可以掌握。

    C++11 为了更方便字符串处理,提供了正则表达式类库,比如 regex 类,regex_match、regex_search、regex_replace等方法,以及 regex_iterator 这个迭代器类。用起来非常方便,功能也很强大。

    • 容器类库

    常见的容器,如 vector 、 list 、 map 、 set 、queue 、 stack 、 deque 、 multimap 、 multiset 等,基本可以满足日常的开发需要。C++11 引入了定长数组 array ,具有 C 风格数据的特性,更有 C++ 的便利操作;还有 unordered_set 、 unordered_map 等新的非排序容器,可以适应不需要排序的场景。

    • 泛型编程

    C++ 里的泛型算法库,用起来非常方便,比如 find 、 find_if 、 count 、 count_if 、search 、search_n 、 copy 、 copy_n 、 copy_if 、 sort 、 partial_sort 、 binary_search 、 stable_sort 等等,功能非常强大。这些算法多数基于容器和迭代器,忽略具体数据类型,使用起来稍稍有些难度,不过掌握了容器、模板、迭代器等内容后,就可以很快应用起来。

    • 多线程和原子操作

    这些都是 C++11 引入的类库,从此以后,C++语言本身有了并发编程的能力,非常酷。一个 thread 类,三五行代码,就可以启动一个线程,简单的使用 mutex 和 lock_guard ,就可以完成线程间的资源同步与保护,棒极了。

    系统调用

    C++ 语言本身只能完成独立于系统的工作,实际的产品往往是与系统紧密相关的,因此必须熟悉系统调用。常见的系统调用,有 socket ,窗口管理系统(GUI)、文件操作等等。推荐我认为经典的几本书,可以帮助我们系统学习。

    Windows 下推荐两本书,《Windows 程序设计》和《Windows 核心编程》,应用开发的话,基本有这两本就够了。Unix/Linux下也推荐两本书,《Unix 高级环境编程》和《Unix 网络编程卷1,套接字》、《Unix网络编程卷2,进程间通信》。前面我们提到 socket ,其实是属于网络编程的一部分,《Unix 网络编程》讲到的东西,Windows 和 Unix/Linux 都能用。

    第三方库类库

    开始学习一门语言时,造轮子可以让我们快速进步,然而一旦你入了门,开始做实际的产品开发时,在稳定性、可维护性和交付期的压力下,就需要合理的利用第三方类库。

    围绕 C++ 语言的第三方类库非常多,简单列一下,仅供参考。

    • GUI:Qt、MFC、WTL、wxWidgets、DirectUI
    • 网络:ACE,libevent,libuv,libev, ASIO
    • 多媒体与游戏:Skia、Cairo,SDL,AV3D, OGRE 3D, Cocos2d-x,ffmpeg、OpenH264、VLC、CxImage、CImg
    • XML:Xerces-C++,CMarkup,libxml++,TinyXML
    • 科学计算:MTL,POOMA, Blitz++ ,CGAL

    学习和使用第三方类库,又分三个阶段(我的订阅号“程序视界”发布过一篇名为“两招让你成为牛X的T型人才”,里面有详细介绍和实例):

    1. 基础开发,主要是了解API、基于API完成应用
    2. 熟悉内核及原理,主要是了解框架的设计原理,阅读源码,洞悉内在机理
    3. 优化框架,主要是针对框架的已有功能的不足进行完善、优化,或者使用框架提供的机制扩展框架功能,或者对框架进行定制,让它适合特定情境

    有些类库功能非常丰富,比如 Qt 、 MFC 、 Cocos2d-x 等,单单一个类库就可以让人钻研几个月到几年,实际使用时,应当根据实际工作需要,先解决眼前的开发任务,然后设定目标、合理利用时间,沿着上面三个阶段来深入学习,培育自己的竞争力。

    总结

    C++ 语言是一门复杂的语言,学习难度较高,学习时应当快速掌握基本知识,然后不断在项目中练习,以点带面扩展学习范围,闲暇时间有计划的在深度和广度两方面持续学习和积累。一旦形成了这样的良性循环,就可以熟练掌握 C++ 语言及相关的类库,不断精进。


    我的订阅号“程序视界”同步发布本文,并举行送书活动,赠送C++之父的《The C++ Programming Language》一书(两册),关注后回复10185查看本文可参与活动。

    展开全文
  • Visual C++开发指南.pdf

    2010-07-27 08:49:15
    Visual C++开发指南Visual C++开发指南Visual C++开发指南Visual C++开发指南Visual C++开发指南Visual C++开发指南Visual C++开发指南Visual C++开发指南Visual C++开发指南Visual C++开发指南Visual C++开发指南...
  • 高质量C++编程指南.PDF

    2020-01-09 18:41:37
    高质量C++编程指南.PDF 高质量C++编程指南.PDF 高质量C++编程指南.PDF 高质量C++编程指南.PDF 高质量C++编程指南.PDF 高质量C++编程指南.PDF
  • 高质量c++编程指南

    2009-03-10 19:17:26
    高质量c++编程指南高质量c++编高质量c++编程指南指南高质量c++编程指南
  • c++builder开发指南

    2011-07-05 14:00:11
    c++builder开发指南c++builder开发指南c++builder开发指南c++builder开发指南
  • Google C++ Style Guide - Google C++ 风格指南 Google C++ Style Guide https://google.github.io/styleguide/cppguide.html Google 开源项目风格指南 (中文版) ... Google C++ 风格指南 ...
  • Google 开源项目风格指南——C++ 风格指南
  • 高质量C++ 编程指南 宝典高质量C++ 编程指南 宝典高质量C++ 编程指南 宝典高质量C++ 编程指南 宝典高质量C++ 编程指南 宝典高质量C++ 编程指南 宝典
  • 高质量C,C++编程指南

    2017-12-11 09:55:38
    高质量C,C++编程指南高质量C,C++编程指南高质量C,C++编程指南高质量C,C++编程指南高质量C,C++编程指南高质量C,C++编程指南高质量C,C++编程指南高质量C,C++编程指南
  • STK C++ 编程指南

    热门讨论 2010-08-27 17:02:30
    STK C++ 编程指南 vc 编程同志 可以参考一下!!
  • 高质量C++ C编程指南.pdf高质量C++ C编程指南.pdf高质量C++ C编程指南.pdf
  • 高质量C++-C编程指南html高质量C++-C编程指南,html版本格式高质量C++-C编程指南html高质量C++-C编程指南,html版本格式
  • C++模板:完全指南 目录 前言 致谢第二版 致谢第一版 关于此书 阅读此书之前 阅览 阅读方式 编程评注 C++11,14,17标准 代码示例与其他信息 反馈 第一部分 基础 1 函数模板 1.1首个函数模板 1.1.1定义模板 1.1.2使用...
  • C++ 性能优化指南

    千次阅读 2018-07-01 03:45:58
    本书是一本 C++ 代码优化指南。作者精选了他在近30年编程生涯中最频繁使用的技术和能够带来最大性能提升效果的技术,旨在让读者在提升 C++ 程序的同时,思考软件优化之美。书中主要内容有:代码优化的意义和总原则,...
  • Disruptor c++使用指南

    千次阅读 2016-11-08 17:17:47
    Disruptor c++使用指南简介Disruptor是一个线程间通信的框架,即在多线程间共享数据。它是由LMAX公司开发的可信消息传递架构的一部分,以便用非常快速的方法来在多组件之间传递数据。 Disruptor最初是在JAVA上被...
  • C++Builder开发 指南.pdf

    2009-01-13 14:11:04
    C++Builder开发 指南.pdf C++Builder开发 指南.pdf C++Builder开发 指南.pdf C++Builder开发 指南.pdf
  • 林锐-《高质量C\C++编程指南

    热门讨论 2010-08-31 13:19:32
    高质量 C C++ 编程指南 林锐高质量 C C++ 编程指南 林锐 高质量 C C++ 编程指南 林锐 高质量 C C++ 编程指南 林锐 高质量 C C++ 编程指南 林锐

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,962
精华内容 28,384
关键字:

c++指南

c++ 订阅