首页 > 编程语言 >c++知识及编译调试

c++知识及编译调试

时间:2024-11-05 19:17:59浏览次数:5  
标签:10 const cout int c++ 编译 fun 调试 函数

文章目录

c++知识

指针

  • 常量(的)指针 const int * p=&a;指针指向可改,指向的值不可改。
  • 指针常量 int * const p=&a;指针不能改,指向的值可改。

查找

unordered_setit!=uset.end()
stringpos !=string::npos
unordered_mapit!=map.end() // key 不存在时 map[key]=0

内存模型

  1. 运行前 操作系统开辟
    • 代码区 存放二进制代码,操作系统管理。所有运行时共享、只读、唯一。
    • 全局区 存放全局(函数体外定义的)和静态变量、常量字符型常量、全局const常量),程序结束后由系统释放。
  2. 运行中
    • 栈区 编译器自动管理释放,存放函数参数局部变量(函数体内)。ps:不要返回局部变量地址,函数结束局部变量内存会被释放,需要返回地址用new
    • 程序员分配释放,否则程序结束后由系统回收
  3. new delete
    • int *p =new int(value); delete p;
    • int *p =new int[size];delete [] p;
    • 指针p在栈中,指向堆区内存。

引用

  • 对变量的引用
    int &a=b;//引用定义时必须初始化不可更改,本质是一个指针常量
  • 函数
    • 形参 int fun(int &){} int fun(int & *){}
    • 函数返回值引用 错误返回局部变量引用 int& fun(){int a=10;return a;}//局部变量a在函数执行完后会被释放;int& fun(){static int a=10;return a;}函数调用可以作为左值fun()=100;等价于int&ref=fun();ref=100;
  • 常量引用
    • const修饰形参防止误操作。int fun(const int &){}
    • int const & ref=10;//等价于操作int t=10;int const &ref=t;错误引用常量int const &ref=10;//要引用合法地址空间

函数

  • 默认参数 //二选一

    • 实现时默认int fun(int a,int b=10,c=20){}//默认参数放后面,错误int fun(int b=10,int c=20;int a){}
    • 声明时 int fun(int a,int b=10,c=20) ;
  • 占位参数 int fun(int a,int ){}默认占位参数int fun(int a,int =10){}

  • 函数重载 //相同函数名,提高复用性
    需要满足以下条件:同一作用域;名称相同;参数类型个数顺序不同。返回值不同不能作为重载条件。

    • const &的重载
    #include<iostream>
    
    using namespace std;
    int fun(int &a){
        cout<<"func(int&a)\n";
    }
    
    int fun(int const &a){
        cout<<"func(int const & a)\n";
    }
    
    int main() {
        int a=10;
        fun(a);//func(int&a)=>int &a=10;
        fun((const int) a);//func(int const & a)=>int const &a=10;
        fun(10);//func(int const & a)=>int t=10;int const &a=t;
        return 0;
    }
    
    
    • 默认参数重载容易出现二义性
    #include<iostream>
    
    using namespace std;
    int fun(int a){
            cout<<a;
    }
    int fun(int a,int b=10){
        cout<<a;
    }
    
    int int main() {
        fun(5);//报错:有多个 重载函数 "fun" 实例与参数列表匹配:
        return 0;
    }
    
    
    

编译调试

1.编译选项

-o name 源代码文件
-On O0 O O1 O2 O3 优化 默认 O0
-std=c++11
-g 可调试 不能-O

2.静态库和动态库

  • 静态库 编译时链接
    • 制作 g++ -c -o lib库名.a 库源代码文件
    • 使用 g++ 选项 源文件 -l 库命 -L 库所在目录
  • 动态库 运行时载入,可共享,库更改后只需更新动态库,不需要重新编译所有代码
    • 设置export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库文件目录
    • 制作g++ -fPIC -shared -o lib库名.so 库源代码文件
    • 使用 g++ 选项 源文件 -l 库命 -L 库所在目录

3.gdb 调试

set arg //设置参数
b n //break设置断点
r //run
n //next执行当前语句,不会进入函数内部
s //step 可以进入有源码函数
p v/eval //print显示变量和表达式的值,会执行表达式
c //continue遇断点停止
set var v=x //设置变量值
q //quit
gdb 程序 core // 调试core ulimit -a ulimit -c unlimited
bt //查看调用栈
ps -ef |grep 程序 //获取程序信息
gdb 程序 -p 123 //调试运行中程序

代码

1. 通讯录

#include <iostream>
#include <limits>
#include <string>
#include <unistd.h>
#define MAX 1000

using namespace std;

// 定义一个联系人结构体
struct person
{
    string name;    // 联系人姓名
    int sex;        // 联系人性别,1表示男,2表示女
    int age;        // 联系人年龄
    string phone;   // 联系人电话
    string address; // 联系人地址
};

// 定义一个通讯录结构体
struct addressbooks
{
    person personArry[MAX]; // 存储联系人的数组,最大容量为MAX
    int size;               // 当前通讯录中的联系人数量
};

// 清空输入缓存区的函数
void clear_instream()
{
    cin.clear();                                         // 清除cin的错误状态
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略直到遇到换行符
}

// 暂停程序,等待用户输入的函数
void _pause()
{
    printf("按回车键继续...\n");
    getchar();        // 暂停程序,等待用户按下回车键
    clear_instream(); // 清空输入缓冲区
    system("clear");  // 清屏
}

// 显示菜单的函数
void showMenu()
{
    cout << "1.添加联系人\n2.显示联系人\n3.删除联系人\n4.查找联系人\n5.修改联系人\n6.清空联系人\n0.退出通讯录\n";
}

// 显示一个联系人信息的函数
void show(person p)
{
    cout << p.name + "\t";
    if (p.sex == 1)
    {
        cout << "男";
    }
    else
    {
        cout << "女";
    }
    cout << "\t" << p.age << "\t" << p.phone << "\t" << p.address << "\t\n";
}

// 输入一个联系人信息的函数
void input(person &p)
{
    clear_instream();
    cout << "请输入联系人姓名:\n";
    cin >> p.name;
    p.sex = 0; // 初始化性别为0
    while (true)
    {
        cout << "请输入联系人性别(1.男 2.女):\n";
        cin >> p.sex;
        if (std::cin.fail())
        {
            std::cerr << "输入错误,请输入一个整数。\n";
            clear_instream();
        }
        else if (p.sex == 1 || p.sex == 2)
        {
            break;
        }
        else
        {
            cout << "输入有误,请重新输入!\n";
        }
    }
    while (true)
    {
        cout << "请输入联系人年龄:\n";
        cin >> p.age;
        if (std::cin.fail())
        {
            std::cerr << "输入错误,请输入一个整数。\n";
            clear_instream();
        }
        else if (p.age >= 0)
        {
            break;
        }
        else
        {
            cout << "输入自然数,请重新输入!\n";
        }
    }
    cout << "请输入联系人电话:\n";
    cin >> p.phone;
    cout << "请输入联系人地址:\n";
    cin >> p.address;
}

// 判断联系人是否存在的函数
int isExist(addressbooks aBook)
{
    if (aBook.size == 0)
    {
        cout << "通讯录为空!\n";
        return -1;
    }
    else
    {
        cout << "请输入联系人的姓名:\n";
        string name;
        cin >> name;
        for (int i = 0; i < aBook.size; i++)
        {
            if (aBook.personArry[i].name == name)
            {
                cout << "找到联系人!\n";
                return i;
            }
        }
        cout << "无此联系人!\n";
        return -1;
    }
}

// 添加一个联系人到通讯录的函数
void addPerson(addressbooks &aBook)
{
    if (aBook.size == MAX)
    {
        cout << "通讯录已满,无法添加!\n";
    }
    else
    {
        input(aBook.personArry[aBook.size]);
        cout << "添加成功!\n";
        cout << "姓名\t性别\t年龄\t电话\t地址\n";
        show(aBook.personArry[aBook.size]);
        aBook.size++;
    }
    _pause();
}

// 显示所有联系人信息的函数
void showPersons(addressbooks aBook)
{
    if (aBook.size == 0)
    {
        cout << "通讯录为空!\n";
    }
    else
    {
        cout << "姓名\t性别\t年龄\t电话\t地址\n";
        for (int i = 0; i < aBook.size; i++)
        {
            show(aBook.personArry[i]);
        }
    }
    _pause();
    return;
}

// 查找一个联系人的函数
void findPerson(addressbooks aBook)
{
    int index = isExist(aBook);
    if (index != -1)
    {
        cout << "姓名\t性别\t年龄\t电话\t地址\n";
        show(aBook.personArry[index]);
    }
    _pause();
}

// 删除一个联系人的函数
void deletePerson(addressbooks &aBook)
{
    int index = isExist(aBook);
    if (index != -1)
    {
        cout << "姓名\t性别\t年龄\t电话\t地址\n";
        show(aBook.personArry[index]);
        cout << "确定删除?(y:确定)\n";
        char select;
        cin >> select;
        if (select == 'y')
        {
            for (int i = index; i < aBook.size - 1; i++)
            {
                aBook.personArry[i] = aBook.personArry[i + 1];
            }
            cout << "删除成功!\n";
            aBook.size--;
        }
        else
        {
            cout << "以取消删除!\n";
        }
    }
    _pause();
}

// 修改一个联系人信息的函数
void modifyPerson(addressbooks &aBook)
{
    int index = isExist(aBook);
    if (index != -1)
    {
        cout << "姓名\t性别\t年龄\t电话\t地址\n";
        show(aBook.personArry[index]);
        cout << "是否修改联系人信息?(y:确定)\n";
        char select;
        cin >> select;
        if (select == 'y')
        { // 确认修改
            input(aBook.personArry[index]);
            cout << "修改成功!\n";
            show(aBook.personArry[index]);
        }
        else
        { // 取消修改
            cout << "已取消修改!\n";
        }
    }
    _pause();
}

// 主函数
int main()
{
    int select;
    addressbooks aBook; // 初始化通讯录
    aBook.size = 0;
    while (true)
    { // 主菜单循环
        showMenu();
        cin >> select;
        switch (select)
        {
        case 1:
            cout << "添加联系人-------\n";
            addPerson(aBook);
            break;
        case 2:
            cout << "显示联系人-------\n";
            showPersons(aBook);
            break;
        case 3:
            cout << "删除联系人-------\n";
            deletePerson(aBook);
            break;
        case 4:
            cout << "查找联系人-------\n";
            findPerson(aBook);
            break;
        case 5:
            cout << "修改联系人-------\n";
            modifyPerson(aBook);
            break;
        case 6:
            cout << "清空联系人-------\n";
            aBook.size = 0;
            cout << "清空成功\n";
            break;
        case 0:
            cout << "欢迎下次使用\n";
            sleep(1);
            return 0;
        }
    }
}

标签:10,const,cout,int,c++,编译,fun,调试,函数
From: https://blog.csdn.net/2301_76954363/article/details/143458303

相关文章