文章目录
c++知识
指针
- 常量(的)指针
const int * p=&a;
指针指向可改,指向的值不可改。 - 指针常量
int * const p=&a;
指针不能改,指向的值可改。
查找
unordered_set | it!=uset.end() |
---|---|
string | pos !=string::npos |
unordered_map | it!=map.end() // key 不存在时 map[key]=0 |
内存模型
- 运行前 操作系统开辟
- 代码区 存放二进制代码,操作系统管理。所有运行时共享、只读、唯一。
- 全局区 存放全局(函数体外定义的)和静态变量、常量(字符型常量、全局const常量),程序结束后由系统释放。
- 运行中
- 栈区 编译器自动管理释放,存放函数参数,局部变量(函数体内)。ps:不要返回局部变量地址,函数结束局部变量内存会被释放,需要返回地址用new。
- 堆 程序员分配释放,否则程序结束后由系统回收。
- 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;
//要引用合法地址空间
- const修饰形参防止误操作。
函数
-
默认参数 //二选一
- 实现时默认
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