C++ Primer学习心得和遇到的问题
2009-06-30 22:03
387 查看
学习心得:
我学习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对此过程作了优化,省去了这些调用。
我学习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对此过程作了优化,省去了这些调用。
相关文章推荐
- C++ Primer学习心得和遇到的问题
- C++ Primer学习心得和遇到的问题
- 记录自己学习心得以及工作中遇到问题的总结
- 记录学习中遇到的问题和解决方案,随着技术提高不断分析心得
- 学习Struct框架是遇到的问题及心得体会
- 记录学习中遇到的问题和解决方案,随着技术提高不断分析心得
- 学习ejb并配置一个简单的helloEjb是遇到问题后总结的经验。
- 学习 zigbee 遇到的问题
- TCP Incast学习之中遇到的问题
- 学习 操作系统 会遇到的一些问题
- 学习C#在tyr catch finally 中遇到的问题
- 记录在学习ML过程中,在MATLAB中集成LibSVM时遇到的问题
- Android开发学习中遇到的问题记录
- 学习单例遇到的问题
- 学习c语言遇到的一些问题(2)(Linux)(makefile)
- R语言学习笔记之<在Linux上遇到的问题集锦>
- Hadoop-2.3.0学习(2)——Wordcount的运行以及遇到的问题
- C#学习中遇到问题、解决问题(1)
- python学习遇到问题
- ReactNative学习中遇到的问题采集