学习C++遇到的一些问题

a84807858 2009-04-11 06:36:11
1.
BookStack bookHouse;
FoodStack foodHouse;
CDStack CDHouse;
Stack warehouse[] = {bookHouse, foodHouse, CDHouse}; // 数组怎么存了不同类型?
for(i=0; i<3; i++)
warehouse[i].Pop();



2.泛型编程是一种基于发现高效算法的最抽象表示的编程方法。也就是说,以算法为起点并寻找能使其工作且有效率工作的最一般的必要条件集。(看不同,谁能通俗的举个例子?)谢谢
令人惊讶的是,很多不同的算法都需要相同的必要条件集,并且这些必要条件有多种不同的实现方式。类似的事实在数学里也可以看到。大多数不同的定理都依赖于同一套公理,并且对于同样的公理存在多种不同的模型。抽象机制!(数学里也可以看到,举例?)谢谢



3.我看到很多的地方用到const,我也知道const怎么用,用在哪里,但我真的不知道什么时候用const,很多时候觉得用不用const无所谓,我想可能是因为我没有做过大的程序所以看不到const到底重要在哪里,比如int ListLength(void)const { return List;} 很明显我不会修改私有成员List.........但还是加了const,我头脑里没个原则或者指南,还请大家指教,提供一个一般性的指导守则,比如什么时候最好用上const,什么时候不用用。谢谢



4.template <class T>
T LinearList<T>::GetElem(int i)
{
if (i>=0 && i<Last)
return data[i];
else
return NULL;
}

return (i<0 || i>=Last) ? NULL:data[i];

if...else 和 条件运算符 ? : 有没有说用谁比较好(在都可以用的情况下)?

NULL我知道是空的意思,但NULL到底是什么,居然可以以T类型返回?



5.
在类的构造函数中总是使用初始化列表的方式对类成员进行初始化。例如
TMyClass::TMyClass(const TData &data) : m_Data(data)
{
}

TMyClass::TMyClass(const TData &data)
{
m_Data = data;
}
要好。
不使用参数华列表的话,变量的默认构造函数就会在上述的这个构造函数之前被偷偷的
调用,然后才会进行赋值操作。如果用了参数话列表的形式的话,只有复制构造函数被
调用。(为什么要调用拷贝构造函数?)


6.
d:\c++\experiment\linearlist.h(83) : error C2244: 'LinearList<T>::InsertElem' : unable to resolve function overload
d:\c++\experiment\linearlist.h(85) : error C2954: template definitions cannot nest

意思?









7.

template <class T>
const int defaultSize = 10;
class LinearList
{
private:
T* data;
int MaxSize;
int Last;
public:
LinearList(int MaxSize = defaultSize);
...
};


d:\c++\experiment\linearlist.h(2) : error C2734: 'defaultSize' : const object must be initialized if not extern

什么意思?



8.
cerr  

cerr与cout的主要区分就是,cout输出的信息可以重定向,而cerr只能输出到标准输出(显示器)上。
cerr不能重定向,只能输出到显示器,不经过缓冲区。(不经过缓冲区和经过有什么实际的影响?)




谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢
...全文
321 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang_wedon 2009-04-19
  • 打赏
  • 举报
回复
补充一点,编程都是以数学为起点,也是以数学为支点的
wang_wedon 2009-04-19
  • 打赏
  • 举报
回复
对于你的第二个问题,你要是学习了泛函分析等基本课程,就会找出一大堆的例子
朕即天下 2009-04-16
  • 打赏
  • 举报
回复
路过思考一下!
黄志义 2009-04-11
  • 打赏
  • 举报
回复
5、就是int i = 0; 与int i; i = 0;的区别 解释一下
假设TData是这样的
class TData
{
public:
TData(){cout<<"调用TData()"<<endl;};
TData(cosnt TData &data){cout<<"调用TData的拷贝构造函数"<<endl;};
TData& operator = (const TData& another){cout<<"调用TData的赋值函数"<<endl;};
};
假设m_Data 是一个int型变量
[Quote=引用 11 楼 a84807858 的回复:]
5.
在类的构造函数中总是使用初始化列表的方式对类成员进行初始化。例如
TMyClass::TMyClass(const TData &data) : m_Data(data) 而这里只会调用TData的拷贝构造函数
{
}

TMyClass::TMyClass(const TData &data)
//在这里 会偷偷调用TData()来构造m_Data
{
m_Data = data; //在这里 会调用TData的赋值函数
}
要好。
不使用参数华列表的话,变量的默认构造函数就会在上述的这个构造函数之前被偷偷的
调用,然后才会进行赋值操作。如果用了参数话列表的形式的话,只有复制构造函数被
调用。(为什么要调用拷贝构造函数?)
[/Quote]
ltc_mouse 2009-04-11
  • 打赏
  • 举报
回复
1.
bookHouse, foodHouse, CDHouse是派生类,Stack是基类,我也这么认为,但是如果上述的派生类
被强制类型转化为基类,那么这样的数组还有什么用处呢?代码是书上抄下来的
-----------------------
数组里存的应该都是Stack对象了,数组初始化的时候调用了Stack的拷贝构造函数(这里有个向上转型问题,static_cast)。
常见的应该是Stack *warehouse[]={&bookHouse, &foodHouse, &CDHouse}; 基类指针指向派生类,实现多态~

4、NULL一般表示空指针 一般定义值0
这个其实我也知道,但是能作为返回值我就不理解了,返回值应该是同类型的(或者进行强制类型转换),double,int
啊什么还好说,但对于一个template T的T,假设我的T是一个点类,有x,y两个成员
-----------------------
返回对象的时候,类型不一致可能调用对象的构造函数;你可以尝试下,T为点类的话,应该会有编译问题的,呵呵~

5.
:m_Data如果是const变量的话,就必须用初始化列表来初始化,原因就是其只能被初始化不能赋值.
这个朋友所答非所问嘛,我问的是 哪里调用了拷贝构造函数?
-------------------------
也不能算答非所问,const对象确实应该使用初始化列表初始化。m_Data(data)这个可以理解为调用了int的拷贝构造函数呀,因为内置基本类型,跟赋值是一致的;有时候也可能是调用一般的构造函数,如类中有个变量point,传入参数x,y,则TMyClass::TMyClass(int x,int y) : point(x,y){}


6.6.
d:\c++\experiment\linearlist.h(83) : error C2244: 'LinearList <T>::InsertElem' : unable to resolve function overload
d:\c++\experiment\linearlist.h(85) : error C2954: template definitions cannot nest
意思?
-------------------------
这个可能有完整的类定义代码好解释点。猜测,第一个是函数重载失败,定义重复了? 第二个像是说模版定义不能内嵌
a84807858 2009-04-11
  • 打赏
  • 举报
回复
非常感谢大家的回答 非常感谢大家的回答 非常感谢大家的回答 非常感谢大家的回答






1.
BookStack bookHouse;
FoodStack foodHouse;
CDStack CDHouse;
Stack warehouse[] = {bookHouse, foodHouse, CDHouse}; // 数组怎么存了不同类型?
for(i=0; i <3; i++)
warehouse[i].Pop();

哦,大家的意思是bookHouse, foodHouse, CDHouse是派生类,Stack是基类,我也这么认为,但是如果上述的派生类

被强制类型转化为基类,那么这样的数组还有什么用处呢?代码是书上抄下来的



2.
就是问问什么是泛型,我刚接触,看了看介绍,没太明白。是一种新的抽象方法?抽象了数据结构?谁能给通俗的解

释解释


3.
有个朋友说在一切能用const的地方用const,吓了我一跳,好的,谢谢啦,我以后会的


4、NULL一般表示空指针 一般定义值0
这个其实我也知道,但是能作为返回值我就不理解了,返回值应该是同类型的(或者进行强制类型转换),double,int

啊什么还好说,但对于一个template T的T,假设我的T是一个点类,有x,y两个成员

5.
在类的构造函数中总是使用初始化列表的方式对类成员进行初始化。例如
TMyClass::TMyClass(const TData &data) : m_Data(data)
{
}

TMyClass::TMyClass(const TData &data)
{
m_Data = data;
}
要好。
不使用参数华列表的话,变量的默认构造函数就会在上述的这个构造函数之前被偷偷的
调用,然后才会进行赋值操作。如果用了参数话列表的形式的话,只有复制构造函数被
调用。(为什么要调用拷贝构造函数?)

:m_Data如果是const变量的话,就必须用初始化列表来初始化,原因就是其只能被初始化不能赋值.


这个朋友所答非所问嘛,我问的是 哪里调用了拷贝构造函数?


6.6.
d:\c++\experiment\linearlist.h(83) : error C2244: 'LinearList <T>::InsertElem' : unable to resolve

function overload
d:\c++\experiment\linearlist.h(85) : error C2954: template definitions cannot nest

意思?


怎么翻译啊啊啊啊啊??????????????????



非常感谢大家的回答 非常感谢大家的回答 非常感谢大家的回答 非常感谢大家的回答

aa806525280 2009-04-11
  • 打赏
  • 举报
回复
7.

template <class T>
const int defaultSize = 10;
class LinearList
{
private:
T* data;
int MaxSize;
int Last;
public:
LinearList(int MaxSize = defaultSize);
...
};
把template <class T> 与const int defaultSize = 10; 位置换过来就可以了
原因:template <class T> 这个是针对下面的类起作用的,要紧跟下面的类
kiffa 2009-04-11
  • 打赏
  • 举报
回复
3,关于const,无论是各种C++经典书籍(101, effective c++等等无数),还是实际的企业编程手册(Google C++编程规范等等),都大力推广const的使用,简单来说,就是在一切可以使用const的地方使用const,尽可能地去使用const。

那么,为什么要这样做呢?看书、google百度,理论上的优点到处都有解释说明。然后在实践中体会。

4,NULL在概念上表示一个空指针,虽然在标准之前,在早期的一些c/c++编译器中,NULL可能是各种稀奇古怪的东西,但是在标准C++中,它就是0,#define NULL 0
以下内容来自Bj的FAQ:
In C++, the definition of NULL is 0, so there is only an aesthetic difference. I prefer to avoid macros, so I use 0. Another problem with NULL is that people sometimes mistakenly believe that it is different from 0 and/or not an integer. In pre-standard code, NULL was/is sometimes defined to something unsuitable and therefore had/has to be avoided. That's less common these days.

If you have to name the null pointer, call it nullptr; that's what it's going to be called in C++0x. Then, "nullptr" will be a keyword.


其他问题都有人解释了。。。
wxgiter 2009-04-11
  • 打赏
  • 举报
回复

cerr是输出标准错误的ostream对象,一般用于输出程序的错误信息,不经过缓冲直接输出到屏幕。

有时程序运行中会崩溃,这是如果是某个cout出错了,由于没有刷新缓冲区,就会不输出信息直接退出;而cerr

以输出错误信息,有助于定位错误的位置。
liliangbao 2009-04-11
  • 打赏
  • 举报
回复
帮顶~
ltc_mouse 2009-04-11
  • 打赏
  • 举报
回复

const int defaultSize = 10; ///defaultSize是int常量,不应该放在模板里面,提到外面

template <class T>
//const int defaultSize = 10;
class LinearList
{
private:
T* data;
int MaxSize;
int Last;
public:
LinearList(int MaxSize = defaultSize);
...
};

  • 打赏
  • 举报
回复
4.template <class T>
T LinearList <T>::GetElem(int i)
{
if (i>=0 && i <Last)
return data[i];
else
return NULL;
}


return (i <0 || i>=Last) ? NULL:data[i];

if...else 和 条件运算符 ? : 有没有说用谁比较好(在都可以用的情况下)?

NULL我知道是空的意思,但NULL到底是什么,居然可以以T类型返回?

: ? : 用起来简约.效率应该没区别,编译器都有优化的吧

:NULL就是空的意思啊.貌似几乎所有数据类型都可以NULL吧.

5.
在类的构造函数中总是使用初始化列表的方式对类成员进行初始化。例如
TMyClass::TMyClass(const TData &data) : m_Data(data)
{
}

TMyClass::TMyClass(const TData &data)
{
m_Data = data;
}
要好。
不使用参数华列表的话,变量的默认构造函数就会在上述的这个构造函数之前被偷偷的
调用,然后才会进行赋值操作。如果用了参数话列表的形式的话,只有复制构造函数被
调用。(为什么要调用拷贝构造函数?)

:m_Data如果是const变量的话,就必须用初始化列表来初始化,原因就是其只能被初始化不能赋值.

6.
d:\c++\experiment\linearlist.h(83) : error C2244: 'LinearList <T>::InsertElem' : unable to resolve function overload
d:\c++\experiment\linearlist.h(85) : error C2954: template definitions cannot nest

意思?


7.

template <class T>
const int defaultSize = 10;
class LinearList
{
private:
T* data;
int MaxSize;
int Last;
public:
LinearList(int MaxSize = defaultSize);
...
};


d:\c++\experiment\linearlist.h(2) : error C2734: 'defaultSize' : const object must be initialized if not extern

什么意思?


template <class T>
const int defaultSize = 10;
class LinearList
{
private:
T* data;
int MaxSize;
int Last;
public:
LinearList(int MaxSize = defaultSize);    //这里在干嘛?没看明白...成员函数调用?声明?定义?
...
};


黄志义 2009-04-11
  • 打赏
  • 举报
回复
太多了
1、估计BookStack; FoodStack;CDStack;都继承自Stack
2、没想到怎么说明
3、其实用const让编译器帮助发现错误 也防止使用不当造成隐患
4、NULL一般表示空指针 一般定义值0
5、就是int i = 0; 与int i; i = 0;的区别
6、好像是重载的InsertElem未实现
7、template <class T> const int defaultSize = 10; 这两行位置换一下
8、不怎么清楚
帅得不敢出门 2009-04-11
  • 打赏
  • 举报
回复
Stack 如果是
BookStack
FoodStack
CDStack
的基类 那么强制转换成基类了.

#include <iostream>
using namespace std;

class A
{
public:
A(int a):m_a(a){}
int m_a;
};
class B :public A
{
public:
B(int c):A(c),m_c(c){}
int m_c;
};


int main()
{
A a(3);
B b(4);
A arrA[2] = {a,b};
cout << sizeof(arrA[0]) << " " << sizeof(arrA[1])<< " " << sizeof(B);
return 0;
}



output:4 4 8
  • 打赏
  • 举报
回复
1.
BookStack bookHouse;
FoodStack foodHouse;
CDStack CDHouse;
Stack warehouse[] = {bookHouse, foodHouse, CDHouse}; // 数组怎么存了不同类型?
for(i=0; i <3; i++)
warehouse[i].Pop();

:Stack 是基类吧,warehouse数组里的元素只有基类部分有效


2.泛型编程是一种基于发现高效算法的最抽象表示的编程方法。也就是说,以算法为起点并寻找能使其工作且有效率工作的最一般的必要条件集。(看不同,谁能通俗的举个例子?)谢谢
令人惊讶的是,很多不同的算法都需要相同的必要条件集,并且这些必要条件有多种不同的实现方式。类似的事实在数学里也可以看到。大多数不同的定理都依赖于同一套公理,并且对于同样的公理存在多种不同的模型。抽象机制!(数学里也可以看到,举例?)谢谢
:...没看明白

3.我看到很多的地方用到const,我也知道const怎么用,用在哪里,但我真的不知道什么时候用const,很多时候觉得用不用const无所谓,我想可能是因为我没有做过大的程序所以看不到const到底重要在哪里,比如int ListLength(void)const { return List;} 很明显我不会修改私有成员List.........但还是加了const,我头脑里没个原则或者指南,还请大家指教,提供一个一般性的指导守则,比如什么时候最好用上const,什么时候不用用。谢谢

:我很少用const,有时候运算符重载会用用

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧