C++ Primer学习心得和遇到的问题

  学习心得:
  我学习C++ Primer是在Ubuntu8.04下进行的。经过一个多月的学习,我硬是把vi给用熟了,包括选项设置、文本编辑、多窗口编辑等,对gcc的选项和使用也有了全面的了解。其实vi的功能非常强大,可以设置C/C++代码的缩进格式,也可以用ctag进行代码的导航,而gcc就更不用说了,不仅可以编译多种语言的程序,而且还支持交叉编译。我建议大家在学习标准C++时,最好用原始的C++编译器,而不要依赖于IDE。可以用gcc,微软的C++编译器,Intel的C++编译器等,不要用Visual Studio这样的IDE,这样可以养成勤于写代码的习惯。当以后具体学习某个平台的开发时(如Visual C++),就可以用IDE来提高开发效率了。如果想用gcc而又不熟悉Linux,也没关系,gcc是跨平台的,在Windows下面装一个MinGW或CygWin即可,它们都集成了gcc。
  学习时遇到的几个问题:
  (1)我发现Ubuntu下同时开vi和QQ for linux后,vi下的ESC键(退出编译模式)失灵,后来查了一下,原来是与QQ for linux的冲突,腾迅官方已经修正了这个问题,下载最新版的QQ for linux即可。
  (2)对习题13.14,gcc4.2.4的编译运行结果与微软Visual C++ 2008编译器的编译运行结果不同。
程序exam13.14.cpp:

#include <vector>
#include <iostream>

struct Exmpl{
    Exmpl() {std::cout<<"Exmpl()"<<std::endl; }

    Exmpl(const Exmpl &other)
    { std::cout<<"Exmpl(const Exmpl&)"<<std::endl; }

    Exmpl& operator=(const Exmpl &rhe)
    {
      std::cout<<"operator=(const Exmpl&)"<<std::endl;
      return *this;
    }

    ~Exmpl()
    { std::cout<<"~Exmpl()"<<std::endl; }
};

void func1(Exmpl obj) //形参为Exmpl对象
{
}

void func2(Exmpl& obj) //形参为Exmpl对象的引用
{
}

Exmpl func3() //返回Exmpl对象
{
  Exmpl obj;
  return obj;
}

int main()
{
  Exmpl eobj;
  func1(eobj);
  func2(eobj);
  eobj=func3();

  Exmpl *p=new Exmpl;
  std::vector<Exmpl> evec(3);
  delete p;
  return 0;
}

gcc的编译运行结果:
zhouhuansheng@laptop-zhou:~/zhou/cpp$ g++ -o exam13.14 exam13.14.cpp
zhouhuansheng@laptop-zhou:~/zhou/cpp$ ./exam13.14
Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
Exmpl()
operator=(const Exmpl&)
~Exmpl()
Exmpl()
Exmpl()
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()


微软C/C++编译器(Visual C++ 2008)的编译运行结果:
c:/>cl /EHsc exam13.14.cpp
用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 15.00.21022.08 版
版权所有(C) Microsoft Corporation。保留所有权利。

exam13.14.cpp
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:exam13.14.exe
exam13.14.obj

c:/>exam13.14.exe
Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
Exmpl()
Exmpl(const Exmpl&)
~Exmpl()

operator=(const Exmpl&)
~Exmpl()
Exmpl()
Exmpl()
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
    按C++ Primer书中的描述,应与Visual C++ 2008中的结果一致。仔细分析程序和gcc的结果,在执行eobj=func3()时似乎没有调用复制构造函数创建func3()中的局部对象obj的副本,也没有调用obj的析构函数来销毁obj。是不是gcc在这点上没有遵守C++标准?还是gcc作了优化?我估计是gcc对此过程作了优化,省去了这些调用。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页