一文搞懂C++(上)

一、C语言和C++

1、bool类型(c语言中没有,c++中有)

1)两个取值:用来描述真、假,true/false

2)占1字节

3)非0为真

2、内联函数

1)用空间换时间,可以提高程序速率

2)内存膨胀,原来只有声明在代码区,其他在栈区,内联函数定义在代码区,节约了调用函数的时间

3)适合代码简单,多次调用的情况

4)函数格式
 

inline int fun(int num){

函数体

}

3、函数重载

1)在一个项目中,定义两个名字相同的函数,但参数列表必须不同,个数/类型均可

2)下面情况不构成函数重载
 

int func(){};

float func(){};

类型不同,但参数相同

3)举例
 

float func(){

}

double func(int num){

}

int main(){

func();

func(x);

}

4、函数参数缺省

1)在实际应用中,调用函数写实参,因此实参多于形参的使用

2)含义:声明函数的某个参数时,指定一个默认值
 

void func(int num = 0,double val = 3,14){
}
int main(){
func(1,4.5);
func(3);//缺省处理
}

3)缺省只能从后往前缺

4)如果是函数声明,默认值在函数声明的时候给,定义函数的时候不需要给,不能反过来。

5)不能函数重载

5、引用

1)定义:给对象或函数取别名

2)定义引用时必须初始化,一旦引用,不能更改或重复,需要说清是谁的别名

int num;
int& dd = num;

3)引用只是别名,用的是同一块内存

int num = 0;
int& dd = num;
printf("num = %d",dd);
dd = 10;
printf("num = %d",dd);

0;10

4)引用可以是指针、结构体

6、命名空间

1)定义:用来组织和重用代码的编译单元

通过命名空间来避免冲突,解决重名问题

2)作用域运算符:: 读作“里面的”

namespace NAME_1
{
int num = 10;
void func1(){
printf("hello world\n");
}
void func1();
}
//命名空间不加引号
void NAME_1::func1(){
printf("helloworld\n");
}
int main(){
int num = 9;
printf("num = %d\n",num);
printf("num = %d\n",NAME_1::num);
}


9;10

 3)命名空间可以嵌套定义,但不能在函数里面

4)可以分不同地方定义同一个命名空间(重名)

5)命名空间取别名(当命名空间过长)

namespace N = NAME_1;

7、cin和cout

以下三段代码等同

#include<iostream>
std::cin>>num;
std::cout<<num;
std::cout<<num<<endl;
#include<iostream>
using namespace std;
cin>>num;
cout<<num<<endl;
//using namespace
using std::cin;
using std::cout;

7、new和delete

1)类似于malloc和free

#include<iostream>
using namespace std;
int main(){
//申请单个内存
int *p1 = new int;
*p1= 0;
cout<<"*p1 = "<<*p1<<end;
//申请单个内存并初始化
int *p2 = new int(999);
cout<<"*p2 = "<<*p2<<end;
//连续申请多个内存
int *p3 = new int[10];
for(int i = 0;i<10;i++){
p[i] = i;
cout << "p3 = "<<i<<p3[i]<<endl;
}
delete p1;
delete p2;
delete[] p3;
}

2)单个初始化用(),多个初始化用[]

3)delete p3[]:p3首地址的地方到后面做标记的地方(连续一段内存),p3必须为首地址开始的地方。

二、面向过程和面向对象

(一)面向过程

提出问题-分析问题-处理问题

大问题-中问题-小问题

做好这一步,做下一步,直到做完

1、洗澡问题

调用函数->洗澡前(找衣服函数、开热水器函数)-洗澡中-洗澡后

2、优点

1)把问题简化,有条理划分问题

2)使程序结构简单,语法简单,主要是顺序、选择、循环

3)对整个问题有清晰的全貌,知道正确完整的过程

3、缺点

1)数据和函数是分开的,程序散乱,如函数定义的参数类型都是int的,如果参数类型被修改,代码的修改两较大

2)数据公开透明,数据不具有封装性,容易被篡改,不安全,不能上密码

3)函数重载,不适合多人开发

(二)面向对象

1、概述

1)面向过程的继承和发展,是比过程更加完善的思想,可以理解为现实世界是由对象组成的

2)对象在程序中抽象成两部分:属性和行为

属性对应数据,行为对应函数

3)想要实现洗澡的功能->去创造能够实现洗澡功能的对象

4)有问题,创造一个能解决问题的对象

2、特点

1)数据和行为总是结合在一起的,用来表达一个东西就是创造对象,数据和行为分开会导致维护不便,面向对象可以解决这个问题

2)问题分解成一个一个对象能解决的问题

3、面向对象的四个特性:继承、封装、多态、抽象(c++中的类和对下那个,把所有问题的对象提取出相同的属性或行为叫抽象)

3、优点

维护方便,代码重复率比较一样,多线程,低耦合,组件编程

三、类和对象

1、类中可以有数据也可以有函数,函数和数据紧密结合,可以隐藏数据,属性对应数据,函数对应行为

2、类的定义:类是具有相同属性或行为的集合

3、类是对象的抽象,对象是类的具体

4、对象:通过使用类类型定义的变量

5、定义类

class 类名
{
//默认是私有的
private:
//成员  数据  函数
protected:
public:
}

class sheep{
int age;
public:
char name[32];
void eat(){
cout<<"吃点草"<<endl;
}
void speak(){
cout<<age<<endl;//在类中可以使用私有数据
}
private:
void speakEnglish(){
cout<<name<<endl;
}
};
void sheep::speak()//声明在内,定义在外
{
cout<<...
}

//定义对象
int main(){
sheep xiYY;
strcpy(xiYY.name,""喜羊羊);
xiYY.speak();
}

//可以通过一个公有函数修改私有成员
class sheep{
private:
int age = 10;
public:
void set_age(int n){
age = n;
}
};
int main(){
class sheep;
sheep.age_set(10);
}

//使用指针
sheep *p1;
p1 = &xiYY;
p1->eat();
p1->speak();

6、class和struct关键字

在c++中,struct可以定义一个类或结构体,默认公有,但一般使用class,默认公有。

四、string类

#include<string>(没有.h,在c++中不存在.h文件)
string str;
str = "123456";
str.length();//求长度
str.clear();
str == str;//比较
char ch = str[2];

class sheep{
public:
string name;
}

int main(){
sheep xiYY;
xiYY.name = "喜羊羊";
}

五、构造函数和析构函数

(一)普通构造函数

1、定义:创建对象时,完成数据成员的初始化

2、是一种特殊的成员函数

3、构造函数和函数类名相同,参数可以修改

4、构造函数没有返回值类型,也没有返回值

5、构造函数可以函数重载,需要满足函数重载的条件

class myclass{
public:
int num;
private:
int val;
public:
myclass();
myclass(int n,int v){
num = n;
val = v;
}
};
//类外定义,没有返回值类型
myclass::myclass(){

}

6、总结

1)如果定义类时,没有定义构造函数,系统会自动创建构造函数

2)如果在类中定义构造函数,等同于内联函数,所有一般都在类内声明,在类外面,进行定义

3)构造函数会在定义一个类时去调用(系统自动),不能通过对象去调用构造函数,自己不用调,系统主动调。

myclass::myclass(int n,int v){
num = n;
val = v;
}
int main(){
myclass p1;
myclass p1(1,2);
}

4)构造函数只能在public下定义,系统给的也是

5)多个构造函数(函数重载),系统就不会默认分配了

6)如果构造函数有参数,在定义对象时需要传参(可以缺省)

7)在c++中,const修饰的变量变成常量,但在c语言中,还是变量,相当于只读

8)有的数据必须初始化,如const int

6、使用成员初始化列表
 

class myclass(){

public:

const int id;

const int num;

const int val;

public:

myclass(int i,int n):id(i),num(n){

}

};

类外定义

myclass ::myclass(int i),id(i){

}

六、析构函数

1、是一种特殊的函数

2、主要是在对象生命周期结束后进行清理

3、系统可以自动调用析构函数,也可以自己调用

4、析构函数和类型相同,前面加~

5、没有返回值和返回值类型,也没有参数

6、系统默认分配,默认共有

class obj;
obj.~class();

7、对象生命周期结束时才会调用,不是导致程序结束的原因

8、任何想在对象结束时执行的程序,都可以写在析构函数

七、拷贝构造函数

1、是一种特殊的构造函数

2、通过它完成复制的过程,从一个对象得到另一个相同的对象。

3、第一个参数必须是本类的对象的引用

4、先是构造函数,才有可能是拷贝构造函数

5、系统默认给,将成员一一对应赋值,也可以自定义

class myclass{
public:
myclass();
~myclass();
myclass(const myclass& obj){}
};


myclass(const myclass& obj){}
myclass(const myclass& obj,int n){}
//错误用法
myclass(int m,const myclass& obj,int n){}

myclass::myclass(myclass &obj){
name = obj.name;
hp = obj.hp;
speed = obj.speed;
}
myclass::myclass(myclass &obj,int hp1){
name = obj.name;
hp = hp1;
speed = obj.speed;
}

myclass m0; //构造
myclass m1("皮卡丘",“120.12”);//构造
myclass m2 = m3; //拷贝
myclass m4(m0); //拷贝
myclass m5(m0,12);//拷贝
myclass *p = new myclass;

6、调用时机:

1)对象作为形参

2)返回值是类的对象

### 推荐算法概述 推荐系统旨在预测用户的兴趣并向用户提供个性化的建议。这类系统广泛应用于电子商务、社交媒体以及娱乐行业等领域,帮助用户发现感兴趣的商品或内容。为了构建有效的推荐引擎,通常采用三种主要类型的推荐技术:基于内容的过滤(Content-based Filtering),协同过滤(Collaborative Filtering),混合模型(Hybrid Models)[^4]。 #### 协同过滤原理 在众多推荐算法中,协同过滤是最常用的一种方法之一。其核心思想在于利用大量其他用户的行为数据来进行个性化推荐。具体来说,如果两个用户在过去表现出相似的兴趣偏好,则认为他们在未来也会有类似的喜好;同样地,对于同一类商品而言,被一群具有相同品味的人所喜爱意味着这些产品之间存在关联性[^4]。 ##### 用户-项目矩阵(U-V矩阵) 以视频平台为例,可以建立一个二维表格形式的关系结构——用户-视频矩阵(User-to-Item Matrix),其中每一行代表一位特定观众的历史观看记录,而每列则对应不同影片的信息。当面对稀疏的数据集时,可以通过填充缺失值或者仅保留评分较高的条目等方式简化处理过程。 ##### 计算相似度 针对上述提到的两种情况(即寻找相似用户和查找相近物品),需要定义合适的距离度量方式来量化彼此间的差异程度。常见的衡量标准包括余弦相似度(Cosine Similarity)、皮尔逊相关系数(Pearson Correlation Coefficient)等。例如,在计算两部电影之间的相似度时,可以选择后者作为评价指标: \[ \text{similarity}(A, B)=\frac{\sum_{i=1}^{n}\left(r_{Ai}-\bar{r}_{A}\right)\left(r_{Bi}-\bar{r}_{B}\right)}{\sqrt{\sum_{i=1}^{n}\left(r_{Ai}-\bar{r}_{A}\right)^{2}} \cdot \sqrt{\sum_{i=1}^{n}\left(r_{Bi}-\bar{r}_{B}\right)^{2}}} \] 这里 \( r_{Xj} \) 表示第 j 位用户给定 X 物品打下的分数,\( \overline {r_X } \) 则表示所有涉及此项目的平均得分。 ```python import numpy as np from scipy.spatial.distance import pdist, squareform def pearson_corr_matrix(data): """Calculate the Pearson correlation coefficient matrix.""" corr = 1 - squareform(pdist(data.T, metric='correlation')) return corr ``` #### 实现步骤 尽管具体的实施方案可能因应用场景的不同有所变化,但总体上遵循以下几个原则: - **数据预处理**:清洗并整理原始日志文件中的交互事件; - **特征提取**:根据业务需求选取恰当维度描述实体属性; - **模型训练**:运用机器学习框架完成参数估计工作; - **效果评估**:借助离线测试集验证性能表现,并持续迭代优化方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值