栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++笔记(持续更新中)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++笔记(持续更新中)

C++笔记(持续更新中)

前言第二章第三章

整数溢出字符类型浮点数 第四章

字符串

C-style stringstring类其他形式的字符串字面值 结构体共用体枚举指针

new来分配内存指针算术 参考书籍

前言

之前一直使用python,最近在学习C++,记一些笔记

第二章

注意信息流传递的方向(<<或者>>)。
cout是一个ostream对象,cin是一个istream对象。可以使用下面的方法,直接打印carrots对应的数字,C++插入运算符(<<)将根据其后的数据类型相应地调整其行为,这是运算符重载的例子。cout与printf相比,其设计更加灵活,更加好用。

int carrots = 100;
cout<< "Crunch, runch. Now I have "< 

函数编写时,可以将using namespace std放到函数定义的外面。

第三章 整数溢出

函数sizeof()可以得到一个变量所占用的字节数。头文件climits中定义了符号常量来表示类型的限制
如INT_MAX=32767等。整数的溢出现象,short类型的最大值为32767
常见的整数溢出现象如图所示

# include
# include
int main(){
	using namespace std;
	short carrots ;
	short sam = SHRT_MAX;
	unsigned short sue = sam;
	carrots = sam + 1;  // 指定类型为short后就出现溢出了 
	sue = sue + 1;
	cout<< endl;
	cout<< sue;
	cout<< endl;
	cout<< sam + 1;  // 输出仍然为正常结果 应该是数据类型的因素
	// 除非有理由存储为其他类型,一般C++将整数型常量存储为int类型 
	cout<< "Crunch, runch. Now I have "< 

输出为

32768
32768
Crunch, runch. Now I have -32768 carrots.
字符类型

char类型在默认情况下既不是没有符号,也不是有符号,是否有符号由C++实现决定。类型有:signed char; unsigned char; wchar_t; char16_t; char32_t

char fodo;  // may be signed, may be unsigned
unsigned char a;  // definitely unsigned
signed char b;  // definitely signed

如果将char用作数值类型,unsigned char表示范围为0~255,signed char表示范围为-128到127。
wchar_t可以表示系统使用的最大扩展字符集,处理该类型的字符的输入输出可以用wcin和wcout。

浮点数

float数据类型一般是保留六位有效数字。

// 显示小数点后六位小数 
cout.setf(ios_base::fixed, ios_base::floatfield);

在进行数值转换时,“缩窄”变换(字长变短)将是无法通过编译的。

第四章 字符串

C++处理字符串的方式有两种。一种是来自C语言,称为C-style string;另一种为基于string类库的方法。cin.get()和cin.getline()是适用与字符串的输入,对于整数int等的输入会报错。

[Error] invalid conversion from 'int' to 'std::basic_istream::char_type* {aka char*}' [-fpermissive]
C-style string

C-style string以空字符’’结尾。

# include
int main(){
	using namespace std;
	char yamcosts[3] = {'a', 'b', ''}; 
	char xamcosts[3] = {'a', '', 'c'};
	cout<< yamcosts;
	cout<< endl;
	cout<< xamcosts;
	return 0; 
}

输出结果,在打印时,cout遇到’’便会自动停止打印。

ab
a

1.使用cin.getline()可以读取一行的数据,自动加上结束符’’,换行符不保存在输入队列中。

char a[] = "hello!";  //直接定义
cin.getline();  // 是面向行的输入,通过回车键确定结尾,不保留回车键
cin.getline(name, 15);// 将输入读到包含20个元素的name数组中,字符不超过19

使用cin.get()也可读取一行的数据,但是会将换行符保留在输入队列中。

# include
int main(){
	using namespace std;
	const int Arsize = 20;
	char name[Arsize];
	char dessert[Arsize];
	
	cout<<"Enter your name:n";
	cin.get(name, Arsize);
	cout<< "Enter your favorite dessert:n";
	cin.get(dessert, Arsize);
	cout<< "I have some delicious "<< dessert;
	cout<< " for you,"<< name<<".n";
	return 0; 
}
Enter your name:
Tim
Enter your favorite dessert:
I have some delicious  for you,Tim.

在第二次使用cin.get()时直接没有去输入,直接打印出了后面的结果,这是因为第一个的输入的换行符仍然保存在输入队列中,第二个cin.get()识别到上一个输入的换行符,认为输入终止。
可以使用‘拼接方式’来解决这一问题

cin.get(name, Arsize).get();
cin.get(dessert, Arsize).get();
// 或者
cin.getline(name, Arsize).getline(dessert, Arsize);
string类

ISO/ANSI C++98标准通过添加string类扩展了C++库,因此现在可以使用string类型的变量而不是字符数组存储字符串。要使用string类,必须在程序中包含头文件string。string类位于名称空间std中,必须提供一条using指令,或者使用std::string来引用。可以使用string + string的格式直接进行字符串的拼接。下面是一个例子。

# include
int main(){
	using namespace std;
	string str1;
	string str2 = "panther";
	int length = str2.size();  // 得到字符串的长度
	length = strlen(str2);  // 得到字符串的长度
	cout<< "Enter a kind of feline: ";
	cin>> str1;
	cout<< "The first letter in "<< str1<< " is ";
	cout<< str1[0];  // 可以使用数组表示法访问存储在string对象中的字符 
	str1 = str1 + str1;  // 可以直接字符串拼接 
	cout<< endl; 
	cout<< str1;
	return 0; 
}

从键盘上得到一个字符串可以使用cin,也可以使用getline(),需要说明的是,这个getline()不是cin的类方法。

cin>> str1;
// getline第一个参数表明输入的获取位置,第二个表示对应的字符串
getline(cin,str1);
其他形式的字符串字面值
wchar_t title[] = L"cheif";
char16_t name[] = u"Tom";
char32_t place[] = U"Xi'an";

C++11还新增了原始(raw)字符串,在原始字符串中,字符表示就是自己,不需要转义符’’

cout<< R"(use "n" instead of endl.)"<< 'n';
结构体

C++与C的不同之处在于声明结构体变量时不需要使用关键字struct,使用string类型时,要使用std::string,不可直接使用string,或者加上using namespace std。

# include
# include
struct worker{
// 使用string类型时,要使用std::string,不可直接使用string,或者加上using namespace std 
	std::string sex;  
	int age;
};
int main(){
	using namespace std;
	worker Jack= {
	"man",
	30};   // 初始化 
	cout<< Jack.age;
	return 0; 
}

C++11也支持直接两个结构体赋值。

worker Tom;
Tom = Jack;
共用体

共用体是一种数据格式,能够存储不同的数据类型,但是只能同时存储其中的一种类型,共用体只能存储int,long,double。共用体的用途之一是,当数据项使用两种或者多种格式(但是不会同时使用时),可以节省空间。常用于操作硬件数据结构。

union ThreeInOne{
	int int_data;
	long long_data;
	double double_data;
};
枚举

C++的enum工具提供了另一种创建符号常量的方式,

enum bits{one=1, two=2, four=4, eight = 8};
bits B;
B = 3 ;  // 报错,不可以在定义变量后直接将int类型数据赋给B
// 可以直接使用枚举中的值
cout<< eight;

上面例子中bits称为一个枚举,一般来说枚举中的值为整数,赋值时为float,double类型时会报错。
[Error] enumerator value for 'two' is not an integer constant
默认状态下,这个整数就是所列举元素的序号,序号从0开始。 可以在定义枚举类型时为部分或全部枚举常量指定整数值,在指定值之前的枚举常量仍按默认方式取值,而指定值之后的枚举常量按依次加1的原则取值。 各枚举常量的值可以重复。

指针

下面的初始化语句在C++中是不合法的,0xB8000000,程序并不知道这其实表示的是一个地址,而会认为是一个整数。

int *pt;
pt = 0xB8000000;
new来分配内存

基本格式为typeName *point_name = new typeName;

# include
# include
# include
# include
int main(){
	using namespace std;
	int *pt = new int;
	*pt = 100;
	cout<< *pt; 
	return 0; 
}

还可以用new来创建数组。首先介绍两个概率:静态联编,动态联编。静态联编(static binding)是指在编译时给数组分配内存。动态联编(dynamic binding)是指数组等数据是在运行时创建的。

int *pt = new int[12]; //new返回第一个数的地址,该地址被赋给指针pt
delete[] pt; // 使用delete来释放new创建的数组,是数组就要有[]
int *p = new double;
delete p;
cout << pt[0]; // 直接将new创建的得到的指针pt当作数组名使用即可
// 我们不能直接修改数组名,但是可以修改指针。

下面的例子更好地体现了动态数组的特点,可以根据运行结果动态地开辟数组。

int n;
cin >> n;
int *pt = new int[n];

同样地,也可以使用new创建动态结构体。

# include
struct worker{
	std::string sex;  // 使用string类型时,要使用std::string 
	int age;
};
int main(){
	using namespace std;
	worker *ps = new worker;
	getline(cin, ps->sex);
	cin>> (*ps).age;
	cout<< ps->age<< endl;
	cout<< ps->sex<< endl;
	return 0; 
}
指针算术

指针变量加一,增加的量等于它指向的类型的字节数,比如将指向double的指针加1,数值将增加8。
对一个指向数组的指针使用sizeof()返回指针所占的字节数,对数组使用sizeof()得到整个数组所占的字节数。

int a[10] = {0};
cout<< sizeof(a);
int *pt = new int[10];
cout<< sizeof(pt);

对数组名取地址时,数组名不会被解释为其地址,数组名被解释为其第一个元素的地址,而对数组名应用地址运算符,得到的是整个数组的地址。具体来讲就是a指向一个包含10个元素的int类型的数组

cout<< &a < 
参考书籍 

C++ Primer Plus

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/718399.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号