C++学习-4-第二篇-20221227-20230103

在这里插入图片描述

按照这本书的顺序,不懂得查别的资料了,不理解的好多

第二篇

ch3 类型

3.1文字常量
3.2变量
  • 变量和文字常量都有存储区 并且有相关的类型 区别在于变量是可寻址的,对于每一个变量 都有两个值与其相关联
    1.它的数据值 存储在某个内存地址中 有时这个值也被称为对象的右值 rvalue 读做 are-value 我们也可认为右值的意思是被读取的值 read value 文字常量和变量都可被用作右值
    2.它的地址值——即 存储数据值的那块内存的地址 它有时被称为变量的左值 lvalue读作 ell-value 我们也可认为左值的意思是位置值 location value 文字常量不能被用作左值
3.3 指针类型
3.4字符串类型
  • 字符文字前面可以加 L 例如
    L’a’ 这称为宽字符文字 类型为 wchar_t 宽字符常量用来支持某些语言的字符集合 如汉语
    日语 这些语言中的某些字符不能用单个字符来表示.

练习 3.1
说明下列文字常量的区别
(a) ‘a’, L’a’, “a”, L"a"
(b) 10, 10u, 10L, 10uL, 012, 0xC
© 3.14, 3.14f, 3.14L

练习 3.2
下列语句哪些是非法的
(a) “Who goes with F\144rgus?\014”
(b) 3.14e1L
© “two” L"some"
(d) 1024f
(e) 3.14UL
(f) “multiple line
comment”

在这里插入图片描述

练习 3.3
下列定义哪些是非法的 请改正之
(a) int car = 1024, auto = 2048;
(b) int ival = ival;
( c) int ival( int() );
(d) double salary = wage = 9999.99;
(e) cin >> int input_value;

练习 3.4
区分左值与右值 并给出它们的例子

练习 3.5
说明下列 student 和 name 两个实例的区别
(a) extern string name;
string name( “exercise 3.5a” );
(b) extern vector students;
vector students;

练习 3.6
下列名字哪些是非法的 请改正之
(a) int double = 3.14159; (b) vector< int > _;
© string namespace; (d) string catch-22;
(e) char 1_or_2 = ‘1’; (f) float Float = 3.14f;

练习 3.7
下面的全局对象定义和局部对象定义有什么区别(如果你认为有区别的话)
string global_class;
int global_int;
int main() {
int local_int;
string local_class;
// …
}


3.5 const常量
  • const int bufSize = 512 // 缓冲区大小 .定义 bufSize 是一个常量 并将其初始化为 512 在程序中任何改变这个值的企图都将导致编译错误 因此 它被称为是只读的 read- only .
  • 一旦引用已经定义 它就不能再指向其他的对象
3.6 引用
  • 引用 reference 有时候又称为别名 alias 它可以用作对象的另一个名字 通过引用我们可以间接地操纵对象 , 引用主要被用作函数的形式参数——通常将类对象传递给一个函数
3.7 布尔类型
  • 布尔型对象可以被赋以文字值 true 或 false
3.8 枚举类型 enum
  • 枚举类型最常见也最有意义的用处之一就是用来描述状态量.

  • 不能做到的是打印枚举成员的实际枚举名.

  • 不能使用枚举成员进行迭代.

  • 可以定义枚举类型的对象 它可以参与表达式运算 也可以被作为参数传递给函数.

  • 枚举类型的对象能够被初始化 但是只能被一个相同枚举类型的对象或枚举成员集中的某个值初始化或赋值.

  • 这个讲的明白:https://www.runoob.com/w3cnote/cpp-enum-intro.html

  • 枚举变量的值只能取枚举常量表中所列的值,就是整型数的一个子集。

  • 枚举变量占用内存的大小与整型数相同。

以下定义:
//定义枚举类型之后,就可以定义该枚举类型的变量,如:
//color_set1 color1, color2;
//默认状态下,这个整数就是所列举元素的序号,序号从0开始
enum color_set1 {RED, BLUE, WHITE, BLACK} color1, color2;
enum color_set2 { GREEN, RED, YELLOW, WHITE} color3, color4;
  • 枚举变量能参与赋值关系运算以及输出操作,参与运算时用其本身的整数值。不能直接输入。不能直接将常量赋给枚举变量。如: color1=1; //非法
  • 不同类型的枚举变量之间不能相互赋值。如: color1=color3; //非法
  • 枚举变量的输入输出一般都采用switch语句将其转换为字符或字符串;枚举类型数据的其他处理也往往应用switch语句,以保证程序的合法性和可读性。
3.9 数组类型
  • C++没有提供编译时刻或运行时刻对数组下标的范围检查 除了程序员自己注意细节 并彻底地测试自己的程序之外 没有别的办法可防止数组越界

练习 3.22
下面哪些数组定义是非法的 为什么
96 第三章 C++数据类型
int get_size();
int buf_size = 1024;
(a) int ia[ buf_size ]; (d) int ia[ 2 * 7 - 14 ];
(b) int ia[ get_size() ]; (e) char st[ 11 ] = “fundamental”;
© int ia[ 4 * 7 - 14 ];

练习 3.23
下面代码试图用数组中每个元素的索引值来初始化该元素 其中包含了一些索引错误
请把它们指出来
int main() {
const int array_size = 10;
int ia[ array_size ];
for ( int ix = 1; ix <= array_size; ++ix )
ia[ ix ] = ix;
// …
}

-多维数组-数组与指针

  • 以下两种形式都返回 数组的第一个元素的地址:
ia
&ia[0]
 const int rowSize = 4; 
 const int colSize = 3; 
 int ia[ rowSize ][ colSize ];
遍历数组的方式
定义模板函数:
#include <iostream> 
template <class elemType> 
void print( elemType *pbegin, elemType *pend ) 
{ 
 while ( pbegin != pend ) { 
 cout << *pbegin << ' '; 
 ++pbegin; 
 } 
} 
 现在我们可以给通用的函数 print()传递一对指向**任意类型**数组的指针 只要该类型的输
出操作符已经被定义即可 例如
int main() 
{ 
 int ia[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 }; 
 double da[4] = { 3.14, 6.28, 12.56, 25.12 }; 
 string sa[3] = { "piglet", "eeyore", "pooh" }; 
 print( ia, ia+9 ); 
 print( da, da+4 ); 
 print( sa, sa+3 ); 
} 
3.10 vector 容器类型
  • #include < vector >

  • 可以用 size()查询 vector 的大小 也可以用 empty()测试它是否为空

  • vector 可以被另一个 vector 初始化 或被赋给另一个 vector

  • 使用 vector 有两种不同的形式 即所谓的数组习惯和 STL 习惯

数组习惯
   vector< int > ivec( 10 );
   vector< int > ivec( 10, -1 );//定义了 ivec 它包含十个 int 型的元素 每个元素都被初始化为-1
 
STL 习惯
====================================
vector< string > text;//定义一个空 vector
// 插入元素
string word; 
while ( cin >> word ) { 
 text.push_back( word ); 
 // ... 
}
====================================

 text[ i ] //访问元素
====================================
//使用 vector 操作集中的 begin()和 end()所返回的迭代器 iterator对
for ( vector<string>::iterator it = text.begin(); 
 it != text.end(); ++it ) 
 cout << *it << ' ';

练习 3.24 下列 vector 定义中 哪些是错误的 int ia[ 7 ] = { 0, 1, 1, 2, 3, 5, 8 };
(a) vector< vector< int > > ivec; (b) vector< int > ivec = { 0, 1, 1,
2, 3, 5, 8 }; © vector< int > ivec( ia, ia+7 ); (d) vector< string

svec = ivec; (e) vector< string > svec( 10, string( “null” ));

练习 3.25
已知下面的函数声明
bool is_equal( const int*ia, int ia_size,
const vector &ivec );
请实现下列行为 如果两个容器大小不同 则比较相同大小部分的元素 一旦某个元素
不相等 则返回 false 如果所有元素都相等 则返回 true 请用 iterator 迭代访问 vector 可
以以本节中的例子为模型 并且写一个 main()函数来测试 is_equal()函数

3.11复数类型

#include < complex >在这里插入图片描述

3.12 typedef 机制

它并没有引入一种新的类型 而只是为现有类型引入了一个助记符号

3.13 volatile 限定修饰符

#include

3.14pair 类型
3.14 类

练习 3.26 在 String 类的构造函数和赋值操作符的实现中 有大量的重复代码 请使用 2.3 节中展 示的模型 把这些公共代码抽取成独立的私有成员函数 用它们重新实现构造函数和赋值操 作符 并重新运行程序以确保其正确
练习 3.27 修改程序
使其也能够记下辅音字母 b d f s 和 t 的个数
练习 3.28 实现能够返回 String 中某个字符出现次数的成员函数 声明如下
class String { public:
// … int count( char ch ) const;
// … };
练习 3.29 实现一个成员操作符函数 它能把一个 String 与另一个连接起来
并返回一个新的 String 声明如下 class String { public: // … String
operator+( const 2String &rhs ) const; // … };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值