一 、 c++ 给c程序员的建议
1.1 尽量的少使用宏
多使用 枚举 const inline
1.2 变量随时用随时定义
保证这些变量可以及时的初始化
1.3 动态内存分配时
使用new delete 少使用malloc free
1.4 少使用c风格的字符串 多使用string
1.5 少使用强制类型转化
如果需要进行类型转换 就使用转换运算符
1.6 使用面向对象的思想去进行编程
二、面向对象编程
2.1什么是对象
一切皆对象
任何对象 都是一个类型
同类型的对象 可接收相同的消息
对象就是现实中的物体 在计算机中的变量
2.2 类 ----------分类
2.3 分类如何实现
抽取一组对象的共同特征:
car
颜色
价格
牌子
抽取行为:
void run();
void start();
void stop();
2.4 计算机中如何表达一个类型?
使用结构体描述一个类型
特征:成员变量
行为:成员函数
Student
特征:
string name;
int age;
string sno;
行为:
void play(string name);
void learn(string name);
#include <iostream>
using namespace std;
struct Student{
/*特征*/
string name;
int age;
string sno;
bool gender;
double height;
double weight;
/*行为*/
void play(string name){
cout < < "play" << name << endl;
}
void learn(string name){
cout << "learn" << name << endl;
}
void show(){
cout << "my name is " << name
<< "age is" << age << endl;
}
};
int main(){
Student sa={"xxx", 30 };
sa.play("qwer");
sa.learn("c++");
sa.show();
}
2.5设计一个时间 使用struct描述
特征:
int hour;
int min;
int sec;
行为:
/*显示时间*/
void show();
/*调用一次代表走一秒*/
void dida();
/*不断的走秒*/
void run();
#include <iostream>
#include <iomanip>
using namespace std;
struct MyTime{
int hour;
int min;
int sec;
void show(){
cout << setfill('0') << setw(2)
<< hour << ':' << setw(2)
<< min << ':' << setw(2)
<< sec << '\r' << flush;
}
void dida(){
sleep(1);
if(60 == ++ sec){
sec=0;
if(60 == ++min){
min=0;
if(24 == ++hour){
hour=0;
}
}
}
}
void run(){
while(1){
show();
dida();
}
}
};
int main(){
MyTime mytime={11,37,27};
mytime.run();
}
2.6 class 来描述一个类型
struct -----> class
初始化问题 -----> 构造函数
权限问题 -----> class中的数据默认是私有的 struct默认是公开的
私有的
private: 只能在类内访问成员
public: 既能类内 也能在类外
protected: 类内和子类中可以访问
#include <iostream>
using namespace std;
class MyTime{
private:
int hour;
int min;
int sec;
public:
/*为访问私有数据 公开访问接口*/
void setTime(int h=0,int m=0,int s=0){
hour= h;
min = m;
sec=s;
}
void dida(){
sleep(1);
if(60 == ++ sec){
sec=0;
if(60 == ++min){
min=0;
if(24 == ++hour){
hour=0;
}
}
}
}
void run(){
while(1){
show();
dida();
}
}
}
int main(){
MyTime mytime;
/*使用公开的接口 给成员变量赋值*/
mytime.setTime(11,17,37);
mytime,run();
}
2.7使用类描述一个日期 Date
特征:
int year;
int month;
int day;
行为:
设置日期;
显示日期;
#include <iostream>
using namespace std;
class Date{
public :
void setDate(int y=2014,int m=12,int d=12){
year=y;
month=m;
day=d;
}
void show(){
cout << setfill('0') << setw(4)
<< year << '-' << setw(2)
<< month << '-' << setw(2)
<< day << endl;
}
private:
int year;
int mon;
int day;
};
int main(){
Date date;
date.setDate(2012,12,12);
}
三、构造函数
1.1 特点
构建一个对象时 自动调用一次
没有返回值类型
函数名 和 类名相同
目的是为了初始化对象
#include <iostream>
using namespace std;
class Date{
private:
int year;
int month;
int day;
public:
Date(){
cout << "Date()" << endl;
year=2014;
month=1;
day=1;
}
void show(){
cout << setfill('0') << setw(4)
<< year << '-' << setw(2)
<< month << '-' << setw(2)
<< day << endl;
}
};
int main(){
/*类型的实例化*/
Date date;
Date *pd = new Date();
Date *pd1 = new Date;
/*编译器会翻译成函数声明*/
Date date2();
date.show();
}
1.2 一个对象创建的过程
根据类型大小 分配内存
初始化成员变量
基本类型的成员 什么都不做
类类型的成员 就构造这个成员
调用这个了类型对应的构造函数
1.3 构造函数的应用
构造函数 可以有参数 构造函数之间可以形成重载关系。(系统会默认提供一个无参构造函数 但一旦提供构造函数则系统的会自动回收掉)
可以是引用参数的默认值 减少构造函数的个数。但不要引入冲突。
当类型中有const 类型的成员 和引用 类型成员时。这些成员要求在构造函数调用之前就初始化。初始化参数列表时唯一的选择
初始化参数列表 只有构造函数有,构造函数参数表之后 实现体之前。
#include <iostream>
using namespace std;
class A(){
const int x; //const 类型的成员
int y;
int& z; //引用类型成员
public:
/* A():x(100),y(123){
}*/
A(int& z, int x=100,int y=123):z(z),x(x),y(y){//初始化参数列表可以区分谁是参数,谁是成员变量x(x) 第一个为成员变量,第二个为参数
}
void show(){
cout << x << '/' << y << '/' << z << endl;
}
};
int main(){
int p=1;
A a(p);
a.show();
}
四、在实际开发中头文件和实现文件要分离
4.1先写头文件 #ifndef 宏
#define 宏
变量的声明
函数的声明
类型的定义
#endif
4.2 实现文件 实现全局函数
实现类型
去掉类型名 和 成员变量 权限
在每个函数名前加上 类名::
实现函数
4.3 写测试文件 使用类型定义对象
写一个带参宏,完成两个整数取最大值的逻辑
GETMAX(100,200)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理