zoukankan      html  css  js  c++  java
  • 学C++有多难,你知道吗?

    都2020年了,还要学C++吗?C++好多理工科大学里面都有,它的学习难度比其他编程语言比如Python, Javascript, 和Java等等难。那为什么呢?
    C++难的原因有三个基本点:
    提供抽象的同时也贴近硬件模型
    Zero-overhead的抽象
    兼容C
    详细展开
    例子一
    请问下面的代码能正确编译链接吗?
    //book.cpp class Book { public: static int Count; Book() = default; ~Book() = default; } int main() { Book::Count += 1; }
    答案是不能!class Book后面右花括号要有分号! 哪里?如果你写过Java,你会更吃惊!按我们的书写习惯,Book的右花括号已经可以表明类结束了。但是为了兼容C,分号必须要有。为什么呢?因为C里面可以书写下面的代码
    struct Book { } book;
    这样子定义了一个名为book的Book变量。所以C++也需要在定义类的结尾时候书写分号。这个分号我无数次忘记,幸好现在的IDE比较智能,都会提示出来。
    把分号添加了以后,我们能成功编译吗?不能,因为不能成功连接。如果用下面的命令编译
    g++ -std=c++11 book.cpp -o book error是 Undefined symbols for architecture x86_64: "Book::Count", referenced from: _main in book-b5397d.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
    !!??这又是为什么?那是因为 Count只是被声明了,而没有定义。在Java里面这个代码完全没有问题!我第一次写的时候,也吃惊(我之前写过Java。)最后是万能的Google帮忙解决了。这是因为C++区分声明和定义:声明是为了引入一个名字,定义是将名字赋予实体。
    那如果我们直接初始化count为2呢?还是不行,得到的错误是
    book.cpp:4:14: error: non-const static data member must be initialized out of line static int Count = 2; ^ ~ 1 error generated.
    错误提示我们要对count进行定义并且"out of line"。 啥叫out of line?比如在int main()全面初始化
    //book.cpp class Book { public: static int Count; Book() = default; ~Book() = default; }; int Book::Count = 2; int main() { Book::Count += 1; }
    这么简单的代码,我们经过了这么多次修正才正确编译!直到现在,C++17终于意识到,我们也需要像Java那样简简单单在类中定义一个静态变量,引入了inline static variable。所以如果我们使用C++17,那么上面的代码可以写成
    //book.cpp class Book { public: inline static int Count = 2; Book() = default; ~Book() = default; }; int main() { Book::Count += 1; }
    例子二
    下面的代码有什么错误?
    //把Book 类拷贝到这里
    class MyBook:public Book { public: void print() { std::cout<<"my book ";} } int main() { Book book = new MyBook(); }
    例子三
    遇到下面的问题,怎么入手
    : undefined reference to symbol ‘AtlComPtrAssign’ libmylib.so: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status
    例子四
    程序crash了怎么看core dump?
    例子五
    三五构造器记得怎么写吗?
    例子六
    Segment Fault 是什么?
    ……
    “点击链接”加入
     
  • 相关阅读:
    .NET 中的Cache
    ASP.NET Forms身份认证
    深入浅出JavaScript (一)初识
    在线生成 Loading进度条图片网站
    放眼2011:中国管理软件四大趋势分析
    2011BI展望:移动商业智能决胜未来
    企业关注:国内BI市场将呈四大趋势发展
    安家啦
    清理SqlServer日志方法
    云计算添翼移动BI 企业决策运筹帷握
  • 原文地址:https://www.cnblogs.com/mu-ge/p/13782431.html
Copyright © 2011-2022 走看看