c++ primer 学习笔记2Word文件下载.docx
《c++ primer 学习笔记2Word文件下载.docx》由会员分享,可在线阅读,更多相关《c++ primer 学习笔记2Word文件下载.docx(47页珍藏版)》请在冰豆网上搜索。
iostream"
3.using
namespace
std;
4.
5.namespace
6.{
7.
class
CStonewt
8.
{
9.
public:
10.
CStonewt(
double
lbs
)
11.
12.
m_nStone
=
int(
/
Lbs_per_stn;
13.
m_fPds_left
%
Lbs_per_stn
+
-
);
14.
m_fPounds
lbs;
15.
}
16.
int
stn,
17.
18.
stn;
19.
20.
stn
*
21.
22.
CStonewt()
23.
24.
0;
25.
26.
~CStonewt()
27.
28.
29.
30.
void
show_lbs()
const
31.
32.
cout
stone"
pound\n"
endl;
;
33.
34.
show_stn()
35.
36.
37.
38.
private:
39.
enum
14
};
40.
m_nStone;
41.
m_fPds_left;
42.
m_fPounds;
43.
44.}
45.
46.int
_tmain(int
argc,
_TCHAR*
argv[])
47.{
48.
myCat;
49.
myCat
19;
50.
51.
return
52.}
2)将构造函数用作自动类型转换函数似乎是一项不错的特性。
不过,当程序员拥有更丰富的C++经验时,将发现这种自动也行并非总是合乎需要的,因为这会导致意外的类型转换。
因此,最新
的C++实现新增了一个关键字(explicit),用来关闭这种自动特性。
也就是说,可以这样声明构造函数:
1.explicit
2.{
3.
5.
6.}
但此时仍然可以进行myCat=(CStonewt)19.5;
强制类型转换。
3)把CStonewt类对象赋值给int、double变量
要进行这样的操作时,编译器发现右侧是CStonewt类型,而左侧是int、double类型,因此它将查看程序员是否定义了与此匹配的转换函数(如果没有找到这样的定义,编译器将生成错误消息
,指出无法将CStonewt赋给int、double)
如果想要使用这种转换函数,要转换为typeName类型,需要使用这种形式的转换函数:
operatortypeName();
注意以下几点:
a、转换函数必须是类方法
b、转换函数不能指定返回类型
c、转换函数不能有参数
[html]
explicit
~CStonewt(){}
operator
int()
100.5
double()
999.5
41.}
43.int
44.{
46.
(CStonewt)19.5;
47.
fValue
iValue
is:
52.
53.}
类和动态内存分配
小插曲:
strlen()返回字符串长度,但不包括末尾的空字符,因此构造函数len+1,使分配的内存能够存储包含空字符的字符串
1)含有很多隐藏错误的stringBad类
StringBad.h:
1.#ifndef
_STRINGBAD_H_
2.#define
4.#include
5.#include
string"
6.using
8.class
StringBad
9.{
10.public:
StringBad();
StringBad(
char*
str
~StringBad();
friend
ostream&
operator<
(
os,
StringBad&
sb
16.private:
m_str;
m_nLen;
19.public:
static
num_strings;
21.};
23.#endif
StringBad.cpp:
StringBad.h"
4.int
StringBad:
:
num_strings
6.StringBad:
StringBad()
7.{
m_nLen
4;
m_str
new
char[
4
];
num_strings++;
strcpy_s(
m_str,
strlen(
C++"
1,"
\"
object
created"
13.}
15.StringBad:
16.{
1
m_str,m_nLen
22.}
24.StringBad:
~StringBad()
25.{
if
delete[]
num_strings--;
in
the
32.}
34.ostream&
35.{
os
this
sb.m_str
len
sb.m_nLen
os;
39.}
testStringBad.cpp:
6.void
callme1(
rStringBad
function
callme1"
10.}
12.void
callme2(
stringBad
13.{
callme2"
16.}
18.int
19.{
headline1(
Create
headline1"
headline2(
headline2"
sport(
sport"
headline1
headline2
sport
Initialize
one
to
another:
sailer
sport;
sailer"
Assign
anther:
knot;
knot
headline1;
knot"
End
of
main()"
44.
46.}
2)
复制拷贝函数
1.StringBad&
operator=
st)
if(
==
&
st
*this;
6.
str;
st.len;
str:
strcpy(
str,
st.str
12.}
3)
重写下标运算符
1.char&
operator[]
i
m_str[
4.}
5.const
char&
8.}
为什么要提供两个版本。
原因是m_str是常量,而上述方法无法确保不修改数据。
但在重载时,C++将区分常量和非常量函数的特征标,因此提供了另一个仅供constString对象使用的
operator[]()版本
4)
新的String类
3.#include
4.using
6.#define
MAXTEMPSIZE
256
myString
myString()
1,
num_string++;
myString():
myString(
):
myString&
rString
rString.m_str
~myString()
num_string--;
~myString():
HowMany()
num_string;
inline
length()
53.
54.
55.