本周学习总结

一. C++

  1. 类和对象-继承
    简单来说就是把父类的属性继承到子类
    (1)基本语法
class 子类 :继承方式 父类

(2)继承方式
继承方式分为三种,1公共继承,2保护继承,3私有继承,注意的是无论是哪种继承方式,都无法调用父类的private
A公共继承
简单来说就是把父类的public内容放到子类的public,父类的protected内容放到子类的protected,父类的private内容放到子类private,如以下列子

#include <iostream>
using namespace std;

class father
{
public:
	void fun1()
	{
		cout << "我是父类的public" << endl;
	}
protected:
	void fun2()
	{
		cout << "我是父类的protected" << endl;
	}
private:
	void fun3()
	{
		cout << "我是父类的private" << endl;
	}
};

class son : public father
{
public:
	void otherfun()
	{
		fun2();
		// fun3(); 无法调用,因为是父类似有的
	}
protected:

private:

};

int main()
{
	son s1;
	s1.fun1();
	s1.otherfun();
	return 0;
}

B私有继承
就是把父类的属性全部继承到子类的protected,如以下例子

#include <iostream>
using namespace std;

class father
{
public:
	void fun1()
	{
		cout << "我是父类的public" << endl;
	}
protected:
	void fun2()
	{
		cout << "我是父类的protected" << endl;
	}
private:
	void fun3()
	{
		cout << "我是父类的private" << endl;
	}
};

class son : protected father
{
public:
	void otherfun()
	{
		fun1();
		fun2();
		// fun3(); 无法调用,因为是父类似有的
	}
protected:

private:

};

int main()
{
	son s1;
	// 无法调用s1.fun1();,因为在protected里
	s1.otherfun();
	return 0;
}

C私有继承
即把父类的属性继承到子类的private里

#include <iostream>
using namespace std;

class father
{
public:
	void fun1()
	{
		cout << "我是父类的public" << endl;
	}
protected:
	void fun2()
	{
		cout << "我是父类的protected" << endl;
	}
private:
	void fun3()
	{
		cout << "我是父类的private" << endl;
	}
};

class son : private father
{
public:
	void otherfun()
	{
		fun1();
		fun2();
		// fun3(); 无法调用,因为是父类似有的
	}
protected:

private:

};

int main()
{
	son s1;
	// 无法调用s1.fun1();,因为在protected里
	s1.otherfun();
	return 0;
}

(3)构造和析构的顺序
因为父类和子类都是类,必然也少不了构造和析构函数,但处理顺序有点不同,这是我的一句话总结“先有爸爸后有儿子,白发人送黑发人”如以下列子

#include <iostream>
using namespace std;

class father
{
public:
	father()
	{
		cout << "这是父类的构造函数" << endl;
	}
	~father()
	{
		cout << "这是父类的析构函数" << endl;
	}
};

class son : public father
{
public:
	son()
	{
		cout << "这是子类的构造函数" << endl;
	}
	~son()
	{
		cout << "这是子类的析构函数" << endl;
	}
};

int main()
{
	son s1;
	
	return 0;
}

(4)同名函数和成员处理
如果父类和子类有相同的函数或成员,一般调用是调用子类,如要调用父类加作用域即可
如以下列子

#include <iostream>
#include <string>
using namespace std;

class father
{
public:
	void fun()
	{
		cout << "我是父类的fun" << endl;
	}
	string s = "我是父类的string";
};

class son : public father
{
public:
	void fun()
	{
		cout << "我是子类的fun" << endl;
	}
	string s = "我是子类的string";
};

void test()
{
	son s1;
	//直接调用是子类
	s1.fun();
	cout << s1.s << endl;
	//调用父类需加作用域
	s1.father::fun();
	cout << s1.father::s << endl;
}
int main()
{
	test();
	return 0;
}
  1. 类和对象-多态
    (1)满足条件和使用
    条件
    A:有继承关系
    B:子类重写父类虚函数
    使用:父类的指针或引用执行子类对象如以下列子
#include <iostream>
#include <string>
using namespace std;

class father
{
public:
	virtual void fun()
	{
		cout << "我是父类的fun" << endl;
	}
	
};

class son : public father
{
public:
	void fun()
	{
		cout << "我是子类的fun" << endl;
	}
	
};

class bigson : public father
{
public:
	void fun()
	{
		cout << "我是bigson的fun" << endl;
	}

};

void whosefunisthis(father& a) //引用指向子类对象
{
	a.fun();
}


void test()
{
	son s1;
	bigson b1;
	whosefunisthis(s1);
	whosefunisthis(b1);
}
int main()
{
	test();
	return 0;
}

二. 数据结构

  1. 字符串暴力匹配
    例如现有字符串ABABC,要匹配的字符串ABC
    在这里插入图片描述
    匹配顺序
    以画图分析
    在这里插入图片描述
    主串和模式串:在字符串 a 中查找字符串 b,a 称为主串,b 称为模式串。
    逐个比较:从主串的第一个字符开始,逐个与模式串的第一个字符进行比较。
    匹配与不匹配:
    如果当前字符匹配,继续比较下一个字符。
    如果不匹配,主串的比较位置向右移动一位,模式串比较位置重置,然后重新开始比较。
    代码实现
#include <stdio.h>
#include <stdlib.h>

typedef struct String 
{
     char* data;
     int len;
} String;

String* initString() 
{
    String* s = (String*)malloc(sizeof(String));
    s->data = NULL;
    s->len = 0;
    return s;
}

void stringAssign(String* s, char* data) 
{
    if (s->data) //先判断有没有数据,有则清空,避免野指针出现
    {
        free(s->data);
    }
    int len = 0;
    char* temp = data;
    while (*temp) //统计字符个数
    {
        len++;
        temp++;
    }
    if (len == 0) 
    {
        s->data = NULL;
        s->len = 0;
    }
    else 
    {
        temp = data;
        s->len = len;
        s->data = (char*)malloc(sizeof(char) * (len + 1)); //len+1是为了给\0
        for (int i = 0; i < len; i++, temp++) 
        {
            s->data[i] = *temp;
        }
    }
}

void forcematch(String* master, String* sub)
{
    int i = 0;
    int j = 0;
    while (i < master->len && j < sub->len)
    {
        if (master->data[i] == sub->data[j])
        {
            i++;
            j++;
        }
        else
        {
            i = i - j + 1; //开始回溯
            j = 0;
        }
    }
    if (j == sub->len)
    {
        printf("force match success\n");
    }
    else
    {
        printf("force match faile\n");
    }
}

void printString(String* s) {
    for (int i = 0; i < s->len; i++) 
    {
        printf(i == 0 ? "%c " : "-> %c ", s->data[i]);
    }
    printf("\n");
}

int main()
{
    String* s = initString();
    String* s1 = initString();
    stringAssign(s, "hello");
    stringAssign(s1, "he");
    printString(s);
    printString(s1);
    forcematch(s, s1);
    return 0;
}

三.下周任务以及留存问题

任务

  1. 继续学习c++
  2. 继续数据结构学习
  3. 再次总结所有51单片机学习内容开展stm32单片机学习
  4. 寻找单片机小项目的bug
### 关于程序员个人成长的总结与方法 #### 成长背景与现状 当前中国的Java程序员数量已超过百万,随着IT行业的快速发展以及大量新人涌入市场,竞争日益激烈[^1]。因此,无论是初入职场的新手还是已有一定经验的老手,都需要思考如何有效提升自己以适应行业需求。 #### 职业发展阶段分析 对于工作2至5年的Java程序员而言,其职业路径通常会经历以下几个阶段: - **基础巩固期**:此阶段主要关注核心编程技能的学习与掌握,例如数据结构、算法设计及面向对象编程原则。 - **实战积累期**:参与实际项目开发,在实践中加深对软件工程的理解并解决复杂问题的能力。 - **技术深化期**:深入研究特定领域内的先进技术(如分布式系统、微服务架构),同时培养团队协作能力和管理技巧[^3]。 #### 面临挑战及其应对策略 许多程序员在职业生涯中期可能会遇到瓶颈——当他们被赋予更多责任时却发现自己缺乏必要的经验和知识来胜任新角色[^2]。针对这种情况可采取如下措施: 1. 明确目标方向 结合自身兴趣爱好和发展潜力设定清晰的职业规划;定期评估进展状况以便及时调整计划。 2. 构建完善的知识体系 不仅局限于编码本身,还应涉猎计算机科学基础知识(操作系统原理、网络协议)、数据库优化等方面的内容。此外还需注重非技术层面的成长,比如沟通表达力、时间管理等软实力的锻炼。 3. 积极投身开源社区贡献代码 这不仅能提高技术水平还能扩大人脉圈层获得更多学习机会。 4. 善用在线资源平台自学充电 利用MOOC课程网站观看高质量视频教程阅读经典书籍文献资料等方式保持终身学习态度。 ```java // 示例代码展示良好的编程习惯 public class GrowthPlan { public static void main(String[] args){ System.out.println("坚持每天进步一点点"); // 定义长期目标 String longTermGoal = "成为行业内顶尖专家"; // 将大目标拆解成若干个小任务逐步完成 List<String> shortTasks = Arrays.asList( "每周阅读一篇专业技术文章", "每月尝试一种新的框架工具" ); for (String task : shortTasks){ executeTask(task); } } private static void executeTask(String taskName){ System.out.printf("正在执行:%s%n",taskName); } } ``` #### 综述 综上所述,作为一位追求卓越的开发者应当制定合理可行的成长方案并通过坚持不懈的努力去实现它。只有这样才能够在这个瞬息万变的技术世界里立于不败之地[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值