您的位置:首页 > 编程语言 > C语言/C++

关于C++思考(一)

2015-03-24 22:18 204 查看

前言

这个仅仅是自己在使用C++的时候一些的总结与思考,也许不带有很大的连贯性。

思考

1.类的构造函数为什么必须与类名相同?为什么不是其他的的形式呢?

A:类的构造函数是由谁来调用呢?是编译器,不是人,所以必须选择一种方式编译器能很好的调用,若是选择其他的形式,可以与其他函数名重复了。构造函数和析构函数都是由编译器进行调用,因此类的用户就能把精力集中在如何使用类的上面

2.为什么需要函数重载呢?

**A:构造函数已经与类名相同了,若是想与其他方式创建一个类呢?这就需要重载了。其实不管在程序中的函数的命名如何花哨,在编译器内部函数的标识都是唯一的,这也就理解了为什么函数重载必须参数类型不同~~若是使用返回值进行重载呢?

当编译器能从上下文中唯一确定函数的意思时,如 int x = f();这当然没有问题。然而,在 C中,我们总是可以调用一个函数但忽略它的返回值,在这种情况下,编译器如何知道调用哪个函数呢?更糟的是,读者怎么知道哪个函数会被调用呢?仅仅靠返回值来重载函数实在过于微妙了,所以在 C + +中禁止这样做。**

3.向冻结的OStrStream添加字符导致未定义的行为~~那什么事冻结呢?

*A:一般地,如给 A更多的字符,它将用完存储空间。通常 A试图在堆中分配更多的存储空间,这经常需要移动存储块。但是流对象刚刚把它的存储块的地址交给我们,所以我们不能很好地移动那个块,因为我们期望它处于特定的位置。OStrStream处理这个问题的方法是“冻结”它自己。只要不用 str()请求内部char,就可以尽可能向串输出流中追加字符。

还要记住,当冻结之后,ostrstream不再负责清理内存了,必须自己清理内存**

4.C++的内部链接和外部链接的区别~~~~(链接错误!!!!)

现在对c++中的连接有了一个认识,能清楚的知道是什么原因产生连接时错误。当你在连接时产生连接不到的错误,这说明所有的编译单元都没有这个实体的外部连接;当你在连接时发现有多个连接实体,这说明有多个编译单元提供了同名的有外部连接的实体。同时,在进行程序设计时,也要注意不要使只有本编译单元用到的函数、类、变量等有外部连接,减少与其它编译单元的连接冲突。

链接的时候会出现以下的错误::::::::::::::

(1)为什么有时会出现aaa已在bbb中重定义的错误?

答:你可能在不同的cpp中重复定义了一个具有外部链接的函数或变量,链接器在链接时找到了多个一样的函数或变量定义

(2)为什么有时会出现无法解析的外部符号?

答:你可能只提供了函数或变量的声明,没有提供其定义,或者声明和定义的函数原型不一致,链接器没有找到其定义在哪里,所以在链接环节出现了无法解析的外部符号的错误

(3)为什么有的内联函数的定义需要写在头文件中呢?

答:因为内链函数是内部链接的,如果你在b.cpp中定义这个函数,那么在a.cpp中即使有这个函数声明,但由于内链函数是内部链接的,所以b.cpp不会提供其定义

所以在链接时a.obj无法找到这个函数的定义,便会出现无法解析的外部符号的错误。

(4)为什么对于模板,声明和定义都在写在一起呢?

答:我们假设我们有如下结构的代码

b.h
#pragma once
template<typename T>
class A
{
public:
A(const T &t);
};


b.cpp
#include "b.h"
#include <iostream>

template<typename T>
A<T>::A(const T &t)
{
std::cout << t << std::endl;
}


a.cpp
#include "b.h"

int main()
{

//A<int> a(5);
return 0;
}


那么a.cpp中注释的那行代码能否正常运行呢?答案是不能我们首先来分析一下编译器在编译a.cpp时,发现其缺少A::a(const int& t)的定义而在编译器编译b.cpp时,由于每个编译单元是独立的,b.cpp不知道a.cpp需要A::a(const int& t)的定义,所以它不会提供A::a(const int& t)的定义这样在链接时a.obj无法找到A::a(const int& t)的定义,就会出现无法解析的外部符号的错误
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: