C++(Day35)

一、学习内容

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 的核心内容,掌握容器、算法和迭代器的使用。

相关推荐
code_shenbing42 分钟前
跨平台WPF框架Avalonia教程 十四
开发语言·ui·c#·wpf
932我1 小时前
C++中的组合模式
开发语言·c++·组合模式
MrJson-架构师1 小时前
java 操作Mongodb
java·开发语言·mongodb
红中马喽1 小时前
JS学习日记(jQuery库)
开发语言·javascript·笔记·学习·jquery
橘子真甜~1 小时前
9.C++面向对象6(实现一个较为完善的日期类)
开发语言·c++
这将会是一个好名字1 小时前
Mac上详细配置java开发环境和软件(更新中)
java·开发语言·macos
吃榴莲的小鳄鱼2 小时前
深挖C++赋值
java·开发语言·c++
0x派大星2 小时前
【Golang】——Gin 框架中的模板渲染详解
开发语言·后端·golang·go·gin
q567315232 小时前
Django 外键引用另一个表中的多个字段
开发语言·数据库·后端·django·sqlite