一、学习内容
C++绪论
C++是C语言的拓充,C++包含C的所有属性,换一句话说,C语言的语法在C++中都合法。 C语言是面向过程的编程思想。 C++语言是面向对象的编程思想。(半面向对象,半面向过程) 可以说在C++中一切皆对象。 C++的三大属性:封装、继承、多态
2.
C++对C的兼容
-
C语言文件: XXX.c
编译C语言文件: gcc XXX.c / gcc XXX.c -o
-
C++语言文件: XXX.cpp
编译C++语言文件 : g++ XXX.cpp / g++ XXX.cpp -o
-
头文件 (声明 宏定义,函数的声明,类型的声明)
C语言 (一般以.h结尾)eg: #include<stdio.h>
C++ (一般不以.h结尾) eg: #include<iostream>
C++的第一条语句
#### cout
cout是输出类的类对象,具有输出功能,可以自动识别数据类型,无需加格式符。
\<\< 插入符 (输出符) endl 换行 (等价于 '\\n')
#### #include \<iostream\>
* # 预处理
* include 包含包括
* \<iostream\> //标准的输入输出流
* istream 输入流 ostream 输出流
#### using namespace std;
* using 使用命名空间的关键字
* namespace 命名空间的关键字
* std 标准的
#### cin
cin是输出类的类对象,具有输入功能,可以自动识别数据类型,无需加格式符。
\>\> 提取符 (输入符) 无需加\&符
C++中的数据类型
基本数据类型:char 、short、int 、float、double、long、bool、string 构造数据类型:数组、指针、结构体、共用体、枚举、类
*
#### 浮点型
* 保留有效位数6位,并且存在四舍五入
* 如果想改变保留有效位数,则需要一个方法(函数),该函数需要包含一个头文件 #include\<iomanip\>
cout \<\< setprecision(4) \<\< c \<\< endl;
* 保留小数点后几位
cout \<\< setprecision(3) \<\< fixed \<\< c2 \<\< endl;
#### 在C++中一旦改变了输出规则,则后续都以这种规则输出
* 以十六进制的方式输出
cout \<\< hex \<\< b \<\< endl
* 以八进制的方式输出
cout \<\< oct \<\< b \<\< endl
* 以十进制的方式输出
cout \<\< dec \<\< b \<\< endl
C++中字符串类型string
在c语言中是没有字符串类型的变量,借助于字符数组存放字符串。 在C++中有字符串类型的变量 , string
*
#### 字符串的输入
getline(cin, name); 包含空格
cin \>\> name 以空格为结束
#### 字符串的比较
由于C++有字符串类型的变量,所以字符串之间的比较,就可以直接使用关系运算符进行比较。
#### 字符串的元素访问
* 下标 -----------\>不判断是否越界
* at() ------------\>判断是否越界
#### C++中的字符串和C语言中的字符风格互换
* C语言风格的字符串可以直接转换成C++风格的字符串。
str = a; 通过赋值c风格的字符串可以直接转换成C++
* C++风格的字符串不可以直接转换成C风格的字符串,需要借助c_str()转换。
strcpy(a, str.c_str()); C++风格字符串需要借助于c_str()进行转换
#### 字符串中常用的函数
* empty() //判断字符串是否为空,为空true 非空 false
* size() //计算字符中元素的个数
* capacity() //计算字符串的容量
#### 字符串类型的初始化和赋值
* string str2 = "hello";
* string str3 = str2;
* string str4(str3); 调用了拷贝构造函数
* string str5(str1, 3);用str1从下标为3的位置初始化给str
* string str6(8,'z');初始化 用8个'z'初始化
脑图
二、作业
作业1:
完成字符串比较的场景
如果登录失败,提示用户登录失败信息,并且提示错误几次,且重新输入
如果输入错误三次,则退出系统
代码解答:
cpp
#include <iostream>
using namespace std;
int main()
{
//string str= "hello world";
//cout << str[4] << endl;
//cout << str[12] << endl;
//cout << str.at(4) <<endl;
//cout << str.at(12) << endl;
string name;
string password;
string username="admin";
string userpassword="123456";
int count =0;
while (1) {
if(count ==3)
{
return -1;
}
cout << "请输入你的账号" << endl;
cin >> name;
cout << "请输入你的密码" << endl;
cin >> password;
if(name == username && password == userpassword)
{
cout << "登录成功!" << endl;
break;
}
else if(name == username && password != userpassword)
{
count ++;
cout << "密码错误"<<count << "次,请重新输入"<< endl;
}else if(name != username && password == userpassword)
{
count ++;
cout << "账号错误"<<count << "次,请重新输入"<< endl;
}else if(name != username && password != userpassword)
{
count ++;
cout << "账号密码都错误"<<count << "次,请重新输入"<< endl;
}
}
return 0;
}
成果展示:
作业二:
继续为 mystring类编写以下方法:
1:析构函数,释放buf指向的堆空
2:编写 append(const mystring r)为当前字符串尾部,拼接新的字符串r
3:编写 isEqual(const mystring r)判断当前字符串和 字符串 r是否相等
代码解答:
cpp
#include <iostream>
#include <cstring>
using namespace std;
class mystring
{
private:
char* buf;//基本数据类型
public:
mystring(const char* str);//绑定了一个构造函数
mystring();//绑定了另一个构造函数
void setBuf(const mystring r)
{
free(this->buf);
int len=strlen(r.buf);
this->buf=(char*)calloc(1,len+1);
strcpy(buf,r.buf);
}
const char* getBuf()const
{
return buf;
}
void show();//绑定了一个显示方法
~mystring();//绑定了一个析构函数
void append(const mystring r); // 拼接字符串
bool isEqual(const mystring r) const; // 比较字符串是否相等
};
mystring::mystring()
{
buf=(char*)calloc(1,1);
}
mystring::mystring(const char* str)
{
int len = strlen(str);
buf=(char*)calloc(1,len+1);
strcpy(buf,str);
}
mystring::~mystring()
{
free(buf); // 释放堆内存
buf = NULL; // 避免悬空指针
}
void mystring::show()
{
cout << buf << endl;
}
// 拼接字符串
void mystring::append(const mystring r)
{
if (r.buf == nullptr) {
cerr << "The source string is null!" << endl;
return;
}
int len1 = strlen(buf); // 当前字符串长度
int len2 = strlen(r.buf); // 追加字符串长度
free(buf);
buf=(char*)calloc(1,len1+1+len2);
strcat(buf, r.buf); // 拼接字符串
}
// 比较字符串是否相等
bool mystring::isEqual(const mystring r) const
{
return strcmp(buf, r.buf) == 0; // 比较内容是否相等
}
int main()
{
mystring ptr;
mystring str = "Hello World";
str.show(); // 显示初始字符串
ptr.setBuf("hello world");
const char* buf = ptr.getBuf();
cout << buf << endl; // 显示设置的字符串
ptr.setBuf(str);
cout << ptr.getBuf() << endl; // 显示复制的字符串
mystring another = "!!!";
//cout << "1111" << endl;
str.append(another); // 拼接字符串
// cout << "1111" << endl;
str.show(); // 显示拼接后的结果ad
mystring test = "Hello World!!!";
cout << (str.isEqual(test) ? "Equal" : "Not Equal") << endl; // 显示比较结果
return 0;
}
成果展现:
作业三:
1:构造函数,打开一个指定的文件
2:write函数 向文件中写入数据
3:read函数,从文件中读取数据,以string类型返回
代码解答:
cpp
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
class File
{
private:
FILE* fp;
public:
File(const char* pathname);
~File();
void write(const string data); // 向文件中写入数据
string read(); // 从文件中读取数据,以 string 返回
};
File::File(const char* pathname)
{
fp=fopen(pathname,"a+");
if (fp == nullptr) {
cout << "文件:" << pathname << "打开失败" << endl;
exit(EXIT_FAILURE);
}
}
File::~File()
{
if(fp)
{
fclose(fp);
fp=NULL;
}
}
void File::write(const string data)
{
if (fp == NULL) {
cout << "File is not open for writing!" << endl;
return;
}
if(fwrite(data.c_str(),sizeof(char),data.size(),fp)!=data.size())
{
cerr << "fwrite error" << endl;
}
fflush(fp);
}
string File::read()
{
if(fp==NULL)
{
cout << "文件不存在" << endl;
return "";
}
//获取文件大小
fseek(fp,0,SEEK_END);
size_t filesize=ftell(fp); //获取文件大小
rewind(fp);//重新将光标定义到开头
char* buffer = new char[filesize+1];//动态设置大小
if(fread(buffer,sizeof(char),filesize,fp)==0)
{
cerr << "fread error" << endl;
delete [] buffer;//释放内存
return "";
}
buffer[filesize]='\0';
string result(buffer);
delete [] buffer;
return result;
}
int main()
{
// 测试文件操作
File file("example.txt");
file.write("Hello, world!");
file.write("\nThis is a test.");
cout << "File write over" << endl;
// 读取文件内容并打印
string content = file.read();
cout << "File in:\n" << content << endl;
return 0;
}
成果展现:
三、拓展
学习方向:
1. C++基础语法与特性:
掌握 C++ 中对 C 的扩展和兼容性。
学习 C++ 的核心特性:面向对象编程,包括封装、继承、多态。
2. 标准库的使用:
掌握 C++ 输入输出流 (`cin`, `cout`) 的基本用法。
熟悉 C++ 的 `string` 类型及其操作。
3. C++高级特性:
深入理解命名空间(`namespace`)及其作用。
学习标准模板库(STL),包括容器(如 `vector`)、算法(如 `sort`)和迭代器的基本用法。
学习重点:
1. C++对C的兼容性:
理解 C++ 能够兼容 C 代码的原因,掌握 C++ 的文件扩展名和编译方式。
熟悉 C 与 C++ 中头文件和输入输出的区别。
2. C++的三大特性(面向对象):
封装:学习如何定义类和对象,理解访问权限(`private`, `protected`, `public`)。
继承:掌握继承的语法、构造函数和析构函数的执行顺序。
多态:理解虚函数(`virtual`)、纯虚函数和接口的用法,学习如何实现运行时多态。
3.输入输出流与格式化输出:
掌握 `cin` 和 `cout` 的用法,理解提取符和插入符的作用。
学习如何使用 `<iomanip>` 进行格式化输出(如控制小数点位数、进制转换)。
4. C++的字符串操作:
理解 C++ 和 C 风格字符串的区别。
掌握字符串的初始化、赋值、比较和常用函数(如 `empty()`, `size()` 等)。
熟悉字符串间的互相转换(`c_str()` 和 `strcpy`)。
学习方法:
1. 理论结合实践:
分模块练习:将每个知识点分解成小练习。例如,编写一个程序分别实现字符串的初始化和比较,练习 STL 的基本操作。
复现示例代码:逐行编写并理解 C++ 中的示例代码,如面向对象的封装、继承、多态特性。
2.实战项目驱动学习:
基础项目:如实现一个简单的银行账户管理系统(包含类的封装、继承和多态)。
进阶项目:如编写一个小型文本处理工具,包含文件读写和字符串操作。
3. 深入阅读与对比:
阅读 C 和 C++ 代码示例,比较两者的输入输出、字符串操作和封装实现的差异。
学习 C++ 的标准库文档,了解不同函数的用法和特性。
4. 问题驱动学习:
提出问题并尝试解决,如"如何用 C++ 的 STL 容器替代传统的数组操作?"、"如何通过多态实现运行时的行为改变?"。
5. 学习进阶路线:
学习 C++ 的异常处理(`try`, `catch`, `throw`)。
了解模板编程(泛型函数和类)。
学习 STL 的核心内容,掌握容器、算法和迭代器的使用。