c++构造函数、静态成员、友元、类模板--lesson11

c++结构体类型、枚举类型等用户自定义数据类型、typedef、new-lesson8 文章目录前言一、结构体类型1.为什么要用结构体2.结构体的普通用法3.结构体的特殊用法14.结构体的特殊用法2二、共用体类型和枚举类型三、typedef1.这是一个什么?2.怎么玩?总结 前言 C++提供一些基本类型的数据类型,但是一般的数据类型已经不能满足应用的需要,这就需要构建一些复杂的数据类型,如数组、结构体类型、枚举类型、类类型(下一章节就会讲到,他其实和结构体一脉相承),这些统称为用户自定义类型(UDT),或者叫派生类型。我觉得派生类型最有意思的是相互的组合,这也是派生类型和基础类型的区别,基 阅读详情


前言

前一章我们对面向对象的程序设计(基于对象的程序设计)有了一个基本的了解,知道了面向对象的两个特征:抽象和封装。后面我们将继续学习面向对象的程序设计(基于对象的程序设计)的基础知识,只有大号基础,才能深入学习c++。


一、构造函数、析构函数

1.构造函数(数据成员初始化)

之前的编程过程中,我们发现给对象初始化是一个很困难的事情,因此C++为了解决这个问题,提供了构造函数来解决这个问题,同时构造函数是public,可以在类内定义构造函数,也可以在类内声明类外定义构造函数。再说一点,实参不能被用户显示的调用,它是定义对象的时候自动调用,如stud.Student()是错误的。
①无参构造函数:和类名同名,没有函数类型和返回值,默认情况下自动会有一个隐式的无参构造函数,在我们定义对象的时候调用,只不过里面什么都没做,有点浪费,现在我们要在里面搞点事情–对象初始化。

②有参的构造函数:
1)赋值语句
类名 构造函数名(类型1 形参1,类型2 形参2,…)
{
赋值语句;
其他语句;
}
在对象定义的时候: 类名 对象名(实参1,实参2,…)

2)参数初始化表
类名 构造函数名(类型1 形参1,类型2 形参2,…):成员初始化表
{
其他剩余赋值语句;
其他语句;
}
③构造函数的重载
和函数的重载原理一致,函数名字相同,但是参数的个数或者参数的类型不同,在建立对象时,系统自动找到与之对应的构造函数
默认的构造函数:可以不用参数而调用的构造函数
④使用默认参数的构造函数(这一点用的时候要小心,注意和③不能混合用,反正我是没有搞明白,貌似分为全部都是默认参数和部分默认参数!!!!)
它的作用相当于好几个重载的构造函数,它的好处:即使在调用的时候没有提供实参,不仅不会出错,而且还会按照默认的参数值对对象进行初始化。
定义方法:
在类声明时就进行函数声明时就给出默认值:Box(int h = 10, int w =10, int len =10);因为类 声明时放在头文件中的,是对外的接口,用户一眼就看到,而函数定义时用户看不到的Box ::Box(int h , int w, int len){构造函数体};,这样用户在使用构造函数定义对象的时候就知道使用的默认值是什么。
constructor.h

#ifndef __CONSTRUCTOR_H__
#define __CONSTRUCTOR_H__

/**
 * 
 */
class Box
{
public:
	//声明一个无参的构造函数,在外部定义函数
	Box();

	//定义一个有参的构造函数,使用的时参数的初始化表对数据成员初始化,在外部就不能再定义了,
	//也可以在这里做声明,外部向这样定义,好像高手都是这么玩的,所以我们要看懂
	//否则出现function '__thiscall Box::Box(int,int,int)' already has a body
	//Box(int h, int w, int len):height(h), weight(w), length(len){};

	//声明一个有参的构造函数,所有的参数都有默认值,这个就需要考虑是否包含上面两个情况,
	//不然编译的时候会出现模糊调用ambiguous call to overloaded function
	//multiple default constructors specified
	Box(int h = 10,  int w = 10, int len = 10);
	int volume();
private:
	int height;
	int weight;
	int length;
};

#endif

constructor.c

#include "stdafx.h"
#include "constructor.h"


Box::Box()
{
	height = 11;
	weight = 11;
	length = 11;
}

Box::Box(int h, int w, int len)
{
	height = h;
	weight = w;
	length = len;
}

int Box::volume()
{
	return (height * weight * length);
}

main.c

#include "stdafx.h"
#include "constructor.h"
#include <iostream>
using namespace std;


int main(int argc, char* argv[])
{
	//调用的时默认参数的构造函数
	Box box(2);

	cout << box.volume();

	return 0;
}

2.析构函数(在撤销对象所占内存之前的一些任何操作)

有人说是和构造函数相反,我觉得他俩压根就不是一回事,析构函数时在对象生命周期结束时,程序自动调用的函数,这个就涉及到对象的作用域啊、局部的还是全局的,是动态的还是静态的等等,和变量是一个道理。总之对象生命周期结束才自动调用。而且一个类只有一个,没有函数参(所以不能被重构)、没有返回值,同时是public,定义的格式:~析构函数名()–析构函数名、构造函数名和类名都叫一个名字。

destructor.h

#ifndef __DESTRUCTOR_H__
#define __DESTRUCTOR_H__

/**
 * 
 */
class Pencil_Box
{
public:
	//声明一个无参的构造函数,在外部定义函数
	Pencil_Box();

	//定义一个有参的构造函数,使用的时参数的初始化表对数据成员初始化,在外部就不能再定义了,
	//也可以在这里做声明,外部向这样定义,好像高手都是这么玩的,所以我们要看懂
	//否则出现function '__thiscall Pencil_Box::Pencil_Box(int,int,int)' already has a body
	//Pencil_Box(int h, int w, int len):height(h), weight(w), length(len){};

	//声明一个有参的构造函数,所有的参数都有默认值,这个就需要考虑是否包含上面两个情况,
	//不然编译的时候会出现模糊调用ambiguous call to overloaded function
	//multiple default constructors specified
	Pencil_Box(int h = 10,  int w = 10, int len = 10);
    //声明析构函数,在外部定义函数
	~Pencil_Box();
	int volume();
private:
	int height;
	int weight;
	int length;
};

#endif

destructor.c


#include "stdafx.h"
#include "destructor.h"
#include <iostream>
using namespace std;

Pencil_Box::Pencil_Box()
{
	height = 11;
	weight = 11;
	length = 11;
}

Pencil_Box::Pencil_Box(int h, int w, int len)
{
	height = h;
	weight = w;
	length = len;
}

Pencil_Box::~Pencil_Box()
{
	cout << "Pencil_Box is over!" << endl;
}

int Pencil_Box::volume()
{
	return (height * weight * length);
}

main.cpp

#include "stdafx.h"
#include "constructor.h"
#include "destructor.h"
#include <iostream>
using namespace std;


int main(int argc, char* argv[])
{
	//调用的时默认参数的构造函数
	Box box(2);

	//调用的时默认参数的构造函数
	Pencil_Box pencil_box(2);
	cout << box.volume();

	return 0;
}

二、对象的数组、对象的指针

1.对象的数组

和普通的变量的数组一样,此时数组中的远元素是一个一个的对象,例如定义一个学生类的对象数组,如果有N个元素就调用N次构造函数,对象数组的初始化有两种方式:
①如果构造函数的实参只有一个,则在定义数组时直接在等号后面的花括号内提供实参:

Student stud[3] = {12, 13 ,14};

但是如果构造函数有多个参数,则不能用这种方法,编译器不知道怎么处理,上述代码中,编译系统会将3个参数分别作为3个元素的第一个实参。
②如果构造函数有多个参数,则需要采用以下的方式:

Student stud[3] = {
	Student(1001, 18 ,87),
	Student(1002, 18 ,76),
	Student(1003, 20 ,87),
};

每个元素分别调用一次构造函数,对每一个元素进行初始化,每个元素的实参分别括号括起来,对应构造函数的一组形参,不会混淆。

//对象的数组
int main(int argc, char* argv[])
{
//	//调用两次默认的无参构造函数
//	Box box[2];

	//调用两次有参的构造函数
	Box box[2] = {
		Box(50, 52),
		Box(10, 11, 12)
	};
	
	cout << box[1].volume();

	return 0;
}

2.对象的指针

类比结构体的指针。

①指向对象的指针
定义:类名 * 对象指针名
可以使用对象加成员运算符(.)访问对象成员,也可以使用对象指针加指向运算符(->)访问对象成员

②指向对象成员的指针(指向对象数据成员的指针和指向对象成员函数的指针)
1)指向对象数据成员:就是普通变量的方式

int *p1; //指向整形数据的指针变量
p1 = &t1.hour;//将对象t1的数据成员hour的地址赋给p1,p1指向t1.hour
cout << *p1 << endl;

2)指向对象成员函数:和普通函数的指针变量不同
普通函数指针的定义:类型名 (*指针变量)(参数列表)
指向对象成员函数(公有)指针的定义:类型名 (类名:: 指针变量名) (参数列表)
指针变量名 = &类名::成员函数名
调用成员函数:(对象名.*指针变量名 ) (参数列表)

void (Time::*p2)();//定义一个指向公有成员函数的指针
p2 = &Time::get_time;//将公有成员函数地址赋值给指针变量
(t1.*p2)();//调用成员函数函数!!!!!!!

③this指针的精髓
this指针时隐式使用的,它是作为参数被传递给成员函数的,本来函数volume的定义是:

int Box::volume()
{
	return (height * width * length);
}

a.volume();

其实C++把它做了如下处理,即在成员函数的形参表列中增加一个this指针,函数将对象的起始地址赋给this,这些是编译系统自动实现的。

int Box::volume(Box *this)
{
	return (this->height * this->width * this->length);
}

a.volume(&a);//调用成员函数时其实内部的机制时这样的

④指针的例子
main.cpp

//对象的指针
int main(int argc, char* argv[])
{
	//使用有参的构造函数定义一个对象
	Time t1(12,30,36);
	//调用成员函数时其实内部的机制时这样的t1.get_time(&t1)
	t1.get_time();
	
	//定义一个对象的指针,并将对象的起始地址赋值给指针p1
	Time *p1 = &t1;
	//调用p1所指向对象的成员函数get_time
	p1->get_time();

	//定义一个指向数据成员的指针,并将数据成员hour的地址赋值给p2
	int *p2 = &t1.hour;
	cout << *p2 << endl;

	//定义一个指向成员函数get_time的指针,并将成员函数get_time的地址赋值给p3
	void (Time::*p3)() = &Time::get_time;
	//调用t1中p3所指向的成员函数!!!!!
	(t1.*p3)();
	

	return 0;
}

Time.cpp


#include "stdafx.h"
#include "Time.h"
#include <iostream>
using namespace std;

//定义一个有参的构造函数
Time::Time(int h, int m, int s){
	hour = h;
	minute = m;
	sec = s;
}

//定义一个公有的成员函数
void Time::get_time(){
	cout << hour << ":" << minute << ":" << sec << endl;
}

void Time::set_time(){
	;
}

Time.h


#include "stdafx.h"
#include "Time.h"
#include <iostream>
using namespace std;

//定义一个有参的构造函数
Time::Time(int h, int m, int s){
	hour = h;
	minute = m;
	sec = s;
}

//定义一个公有的成员函数
void Time::get_time(){
	cout << hour << ":" << minute << ":" << sec << endl;
}

void Time::set_time(){
	;
}

⑤指针的总结
其他的也没有什么好总结的,主要是成员函数的指针,这个有必要好好说一说,我们都知道成员函数不是放在对象的空间中的,而是放在对象外的空间中,是所有对象公用的一个函数代码段,所以给他赋值的时候不能使用如下:指针变量名 = &对象名.成员函数名,结合this指针,我们知道对象名.成员函数名,仅仅就是调用函数而已,对象也不知道成员函数的地址,所以&对象名.成员函数名给成员函数指针变量行不通。但是调用的时候需要这样做::(对象名.*指针变量名 ) (参数列表),而不能这样做:(*指针变量名 ) (参数列表),因为调用的时候需要告诉他对象的地址(记住这么用既可以!!!)。

三、共用数据的保护

尽管使用了private保护,可以有效的预防在类外对对象的私有成员进行操作,但是除了以上的一些情况,还有其他的场景需要注意,c++针对其他的场景设置了专门的语句供大家是使用,但是要注意和static的结合使用。

1.常对象(在定义对象的时候对所有的数据成员作了限制)

①仅仅是在定义对象的时候做const限制,不是声明类的时候!!!,而且定义对象的时候必须初始化,之后在对象的生命周期内所有的数据成员不能改变,定义方式如下:

类名 const 对象名[(实参表)];
或者 const 类名 对象名[(实参表)];

②如果一个对象被定义成常对象,则对外使用的接口函数只能是其中的常成员函数(在类声明的时候加上const修饰符的函数:如void get_time() const;)、系统自动调用的隐式构造函数(这里包括自己定义的构造函数和析构函数,注意和默认构造函数的区别,这里的意思是explicit关键字)和析构函数以及静态成员函数,其他的普通函数在外面都不能用了;
③编译系统因为无法确认在普通成员函数中是否对常对象的成员数据进行修改,以此编译系统的做法是只要在外面调用普通成员函数,就直接不能调用;
④常成员函数也仅仅能访问(引用)常对象中的数据成员,不能修改他们(听说如果想要修改常对象中的某个数据成员,只需要在某个数据成员前面加上修饰符mutable,这样常成员函数既可以访问这个数据成员,也可以修改它)。

2.常对象成员(在声明类的时候对某些数据成员和成员函数作了限制)

①常数据成员:在类的声明中对某些数据成员使用const进行限制,这样这个数据成员就和常变量一样了,注意:对常数据成员进行初始化时只能使用构造函数参数初始化表进行赋值(初始化),其他的普通构造函数都不行,因为他们使用的时赋值语句!!!,如果不这样编译的时候会报错:must be initialized in constructor base/member initializer list

②常成员函数:类型名 函数名(参数表)const;
1)在定义和声明的时候都需要加上const;
2)常对象只保证所有的数据成员都是const的,编译器默认将常对象的成员函数处理为非const的;
3)const和非const函数 是否可以引用和修改 const对象(所有数据成员都是const)和非const对象(数据成员有const的,也有非const的),这个不是很清楚!!,需要后续继续学习补充,先死记住用法!
4)const函数的本质:

const成员函数的写法有两种
 1、void fun(int a,int b) const{}
 2、void const fun(int a,int b){}
这两种写法的本质是:void fun (const 类 *this, int a,int b);
const修饰的不是形参a和b;const修饰的是属性this->a和this->b。与const所写的位置无关。为什么?因为c++对类的this指针做了隐藏,本质上,const指针修饰的是被隐藏的this指针所指向的内存空间,修饰的是this指针。
//类的成员函数可通过const修饰,请问const修饰的是谁 
#include<iostream>
using namespace std;
 class test
 {
     public:
        //1.const写在什么地方没关系  void const oper(int a,int b)==void oper(int a,int b) const
        //为什么没有关系呢?   
        // 2:请问 const修饰的是谁
        //const修饰的是形参a吗?可以在代码中加入a=100,编译通过,说明不是a; 
        //const修饰的是属性this->a。this->b吗?,在代码中加入this->a=100,或者this->b=100,编译器会报错
        //但是感觉不精确,如果修饰的是this->a,this->b,const为什么不写到括号里面呢。
        //由以前的内容可知,非静态函数都默认有一个this指针,
        //所以总而言之,const修饰的是this指针,void const oper(const test*this,int a,int b)
        //意思就是就是说指针所指向的内存空间不能被修改,所以this->a,this->b不能被修改。  
         void oper(int a,int b) const//<==>void const oper(test *this,int a,int b) 
         {
               cout<<"a"<<a<<endl;
            cout<<"b"<<this->b<<endl;
         }
         private:
             int a,int b;
 };
 int main()
 {
     cout<<"hello"<<endl;
     return 0;
 }

//非const成员函数只可以访问非const对象的任意的数据成员(不能访问const对象的任意数据成员);
//(上述原因可详见C++Primer(5th)231页。 在默认情况下,this的类型是指向类类型非常量版本的常量指针,
//例如 Screen类中,this类型为 Screen *cosnt。当在成员函数的后面加上const关键字时,隐式的将this指针修改为 const Screen *const 
//即指向类类型常量版本的常量指针。根据初始化原则,我们不能将一个常量指针赋值给一个非常量指针)

3.指向对象的常指针

①定义:类名 *const 指针变量名;
②含义:const修饰的是指针变量,所以指针变量的值不能改变,即始终指向同一个对象,对象的值可以改变,这个和它无关。
③用法:一般用在函数中,函数形参定义成这样,此时形参就是一个常指针,目的在于保护形参指针的值不能改变,如指针++等操作都不行。

4.指向常对象的指针

①定义:const 类名 * 指针变量名;
②含义:const修饰的是指针指向的对象,所以不能通过指针修改对象的值,但是指针的值可以改变。
③用法:一般用在函数中,函数形参定义成这样,此时形参就是一个指向常对象的普通指针,目的在于保护形参指针所指向的对象,是其在函数的执行过程中不被修改。
④注意事项:
赋值给指向常对象的指针可以是普通对象的地址,也可以是常对象的地址,如果是普通对象的地址,则此时是不能通过指针访问对象内非const函数,因为通过指针访问对象期间,对象具有常对象的特征,其他情况下,对象仍然是一个普通的对象;
赋值给指向普通对象的指针只能是普通对象的地址;
这其实是编译器不智能的体现,它是从根上断绝我们乱用,导致数据错乱,包括之前的const函数等也是一样的。我们细细体会。

5.指向常对象的常指针(前面两者的结合)

6.指向对象的常引用

①定义:void fun(const Time &t);
②含义:由之前引用的含义可以知道。
③用法:一般用在函数中,函数形参定义成这样,这里目的在fun函数中,不能修改t的值,也就是实参的值不能修改,因为他们是指向同一片地址。
④注意事项:常指针和常引用在C++编程中比较常见,因为他们在时间和空间上节约了很多,我们需要经常使用,熟能生巧!

7.指向常对象的引用

8.指向常对象的常引用

四、对象的动态建立(new)和释放(delete)

之前我们定义的对象不能自由的撤销,因为他是静态的,无论是全局的还是局部的,只有在函数或者是程序结束是才释放,和全局变量、局部变量一致,我们可以使用new和delete动态的创建和撤销一个对象,new返回的是一个对象的指针,如果内存不够,则返回NULL,而且这个对象没有名字,只能通过地址访问,所以就定义一个指针来接收他,之后通过指针来访问他,和malloc、free一致,要注意内存溢出和内存泄漏。

Box *pt;
pt = new Box;//自动调用构造函数
delect pt;//自动调用析构函数

五、对象的赋值和复制

1.对象的赋值

如果同一个类定义了两个或者多个对象,则对象之间可以相互赋值,使用的是重载的赋值运算符“=”,注意只有数据成员赋值: 对象1 = 对象2;

2.对象的复制

如果想用一个存在在对象产生一个新的对象,则可以使用对象的赋值,其原理是使用复制构造函数(copy constructor function),它和普通的构造函数类似,系统根据参数的类型自动调用,系统会有一个,像无参的构造函数一样。

①语法:
1)类名 对象2(对象1);
2)类名 对象2 = 对象1;
以上两个都是调用复制构造函数。
②普通构造函数和复制构造函数的区别:
1)在函数声明和定义上:

类名(形参表列);
类名(形参表列){
}

类名(类名 &对象名);
类名(类名 &对象名){
}

2)在调用上:

Box box1(12,13,14);
Box box2(box1);

3)什么时候被调用:
普通构造函数:在建立对象时被调用;
复制构造函数(3种情况下):
i)程序中需要建立新对象,并用另一个同类的对象对它初始化,之前都是这种情形;
ii)当参数的对象为类对象时;
iii)当函数的返回值时类对象时。
以上情况,系统自动参与,我们人为不用干预,就类似this一样,我们需要知道它背后的机理即可。

六、静态成员(静态数据成员和静态成员函数)

1.静态数据成员

静态数据成员是实现类和类对象之间的数据沟通,是所有类以及类对象公有的,和对象不在同一空间,不随对象的消失而消失,如以下类声明:

class sBox
{
public:
	sBox(int, int);
	int volume();
	static int height;
private:

	int width;
	int length;
};

注意注意注意:类内的静态变量仅仅是个声明而已,也就是说height还不存在,需要在cpp实现中加上这么一句:

int sBox::height = 10;//也可以什么都不加int sBox::height;

这才是真正的定义height变量,而不随对象的定义而定义,这样就有了静态变量height,其他的操作就和普通的数据成员一样,public和private同样适用,唯一的区别就是,如果height是public的,则可以使用两种方式引用它,
1)sBox::height;
2)对象名.height。

2.静态成员函数

静态成员函数和非静态的成员函数之间的区别就是:
①非静态的成员函数有默认的this指针,因此它就可以调用静态数据成员,也可以调用非静态的数据成员;
②而静态的成员函数没有,因此它调用非静态的数据成员(对象特有的)有点费劲,需要好好处理一下,c++中好的习惯是静态的成员函数只引用静态的数据成员,我们要向好的习惯看齐;
和静态成员函数一样,则可以使用两种方式引用静态成员函数,
1)类名::静态成员函数;
2)对象名.静态成员函数。

3.内部机制!!!!

类中的静态数据成员仅仅声明,所以可以有如下的语句:

class sBox
{
public:
	sBox(int, int);
	int volume();
	//其实是告诉编译系统,这个变量在其他地方有定义,和extern int height 
	//类似,所以后面int sBox::volume()可以编译通过,
	static int height;
	static int get_h();
private:

	int width;
	int length;
};
//这里才是定义
int sBox::height;

//这里其实是这样的机制
//int sBox::volume(sBox *this)
//{return (height * this->width * this->length);}
int sBox::volume(){
	return (height * width * length);
}

//所以以下的函数是有问题的,因为他不知道width是什么
int sBox::get_h(){
	return (height * width);
}

七、友元和类模板

1.友元(friend)

之前的说明中,我们知道类中分为公有的(public)和私有的(private),在类外可以访问公有的成员(公有数据成员和公有的成员函数),只有本类中的函数才可以访问私有成员(私有数据成员和私有的成员函数),现在我们介绍一种例外–友元,他也可以访问其他类的私有成员,但是在其他类中要将他声明成friend,打个比方,一般的来客只能在客厅活动,但是亲密的朋友可以去书房等私有地方活动,但是首先主人需要将他声明为朋友才可以。

①友元函数:可以是普通函数,也可以是类中的成员函数(貌似是要public的)
用法:在主人的类中声明如下:friend 函数原型;
注意这里涉及到类的提前引用声明,这个没用过,知道这么个概念!
②友元类:直接在其B类声明成A类的友元类,就类似将朋友的一家人声明成朋友,这样就都可以进入主人书房。
用法:在主人的类中声明如下:friend 类名;

2.类模板(这个貌似在实际中用的比较多)

对于功能一致,数据类型不同的类,实现一类多用,如果说类时对象的抽象,对象时类的实例,那么类模板就是类的抽象,类是类模板的实例。在定义对象的时候,编译系统会将实际的类型替换类模板中的类型,从而定义对象。注意类模板的作用域,以代码最后完整的模块为结尾,如这个整个函数,完整的类声明等。

声明和使用类模板:
①先写出一个实际的类;
②将此类中准备改变的类型名(如int)改成自己指定的虚拟的类型名(numtype);
③在类的声明前面加入一行:template<class numtype1,class numtype2 >(备注:此处关键字class不是类的意思,表示其后面跟着的是虚拟的类型名,有多少个虚拟的类型名,就用逗号和class隔开);
④用类模板定义对象时使用以下的语句:

类模板名 <实际类型名1,实际类型名2>对象名;
类模板名 <实际类型名1,实际类型名2>对象名(实参表);

⑤如果在类模板类外定义成员函数,语法要求如下:

template<class numtype1,class numtype2 >
函数类型 类模板名<虚拟类型参数>::成员函数名(函数参数列表)
{
}

总结

这一主要是对面向对象的程序设计中一些的重要语法说明,一定要熟记于心,真正的高手肯定是数运用以上内容,保证效率的同时数据的安全性肯定考虑的很全民啊,如善于运用const等等。

优化点列图(RMS半径)的操作数 阅读详情

相关推荐

JSSIP实战:5分钟搞定WebRTC电话功能(附完整代码示例)

本文通过JSSIP库实战演示如何在Web应用中快速集成WebRTC电话功能。文章提供了从环境准备、SIP服务器连接到完整代码示例的详细步骤,涵盖用户注册、拨号接听、媒体流处理等核心环节,并针对常见问题给出排查方案,帮助开发者高效实现网页端实时语音通信。

u8v9w0x1y的博客 518

C语言报错警告合集(转)

C常见错误 附录1 常见错误中英文对照表 fatal error C1003: error count exceeds number; stopping compilation中文对照:(编译错误)错误太多,停止编译分析:修改之前的错误,再次编译 fatal error C1004: unexpected end of file found中文对照:(编译错误)文件未结束分析:一个函数或...

Goku_Yu的博客 5154

提示词工程的几个参数

低 temperature + 低 top-p:输出最稳定、最可靠,适合需要准确性和一致性的场景。高 temperature + 高 top-p:输出最多样化、最富有创意,适合需要灵感和探索的场景。Max Length:您可以通过调整max length来控制大模型生成的 token 数。指定 Max Length 有助于防止大模型生成冗长或不相关的响应并控制成本。是一个字符串,可以阻止模型生成 token,指定是控制大模型响应长度和结构的另一种方法。例如,您可以通过添加 “11” 作为。

weixin_44212787的博客 1827

【C++】类与对象第五小节-----友元,静态成员

C++类与对象-----静态成员,友元。后续知识持续更新,需要的小伙伴可以点个关注,收藏起来呀~~

scsery的博客 1414

SAP接口错误查询日志

随着数字经济的迅速发展,企业数字化转型不在只追求“业财一体化”,而是在业务端也想要进行更为精细化的管理,所以很多企业在SAP ERP的基础上,集成更多垂直领域更精细的外围系统,比如销售CRM系统,采购SRM系统,生产MES系统等等,琳琅满目的产品,那对SAP实施来说,系统集成过程中,接口的一些报错查询能力必不可少,今天我们就介绍一下,SAP和CRM系统集成中接口常见的报错。

weixin_43657667的博客 2049

core_analyzer分析c++程序内存占用

环境:centos; 进程:单进程多线程c++程序; 问题:1. 分析系统内存占用; 2. 分析ptmalloc内存空洞(bins上的空闲chunk的大小); 包括:1. 占用了很大内存的c++进程; 2. gcore(在进程不core dump的情况下生成core文件); 3. core_analyzer(分析gcor...

weixin_41644391的博客 4812

静态成员,友元函数,友元类

静态数据成员,静态成员函数,友元函数,友元类

一怀明月的博客 2491

编织数据的实时脉络——构建基于MySQL的数据编织平台,实现实时数据治理

除了上述基本设置外,我们还可以根据实际应用场景自定义一些特定的监控项目。例如,对于某些高并发读写的表,可能需要特别关注它们的锁等待时间和回滚段使用率;而对于涉及到跨库关联查询的操作,则应当着重检查网络延迟及缓存命中率等因素。-- 获取InnoDB行级锁等待情况-- 统计各表的缓存命中率这段SQL脚本不仅展示了如何查询InnoDB引擎下的锁争用状况,还介绍了计算表级别缓存命中率的方法,有助于深入理解系统的运行状态。

墨夶的博客 1789

学习笔记 c++ (C++ 类模板的静态成员)

    代码: #include&lt;iostream&gt; using namespace std; template&lt;typename T&gt; class XYZ { public:     void putpri();     static T ipub; private:     static T ipri; }; template &lt;typename ...

qq_42145185的博客 899

在jetson上对fastdeploy进行源码编译(完整版)

在大多数Linux发行版中,你可以使用包管理器安装Python开发包。根据jetpack的版本选择对应的推理库版本。在~/.bashrc中写入这三行。

如果想成为中心,那么就到中心去吧。 678

【基于CKF的IMM】CV和CT两个模型下的IMM,二维,滤波使用CKF(容积卡尔曼滤波),附完整的matlab代码

该文章摘要: 本文提出了一种基于交互多模型(IMM)和容积卡尔曼滤波(CKF)的融合定位算法,用于解决目标在直线运动和转弯机动之间的模型切换问题。通过MATLAB仿真实现了IMM-CKF算法,并与单一的CV-CKF(匀速模型)和CT-CKF(匀角速转弯模型)方法进行对比。实验结果表明,在包含直线段和转弯段的复合轨迹跟踪中,IMM-CKF方法能够自适应调整模型权重,显著提高了定位精度。轨迹跟踪图、位置/速度误差对比图以及模型概率曲线直观展示了IMM算法的优势。文章提供了完整的MATLAB实现代码,可用于目标跟

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 615

C/C++基础概念、代码应用实例超详细总结——(三大特性,静态成员,友元、模板、标准库、STL、设计模式)

1.c++面向对象如何理解?与面向过程有何不同? 要理解面向对象,必须先理解面向过程,因为面向对象就是为了解决面向过程编程的一些繁杂和缺点(比如代码量大时容易命名冲突,代码重复等);这里推荐https://www.zhihu.com/question/27468564 以下个人理解,有误请指出: 简言概括就是将 现实一类事物高度抽象化,将其抽象为一个有内容(数据)和动作(函数方法)的“活物”,我们无需亲力亲为去做一件事,而是让这个活物去做。不使用这个活...

Wmll1234567的博客 2126

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法

Systemcall名屋 1687

C++程序设计-第7周 静态成员、友元、类模板

课程首页地址:http://blog.youkuaiyun.com/sxhelijian/article/details/7910565第一部分 阅读程序 要阅读的程序中存在语法错误,请将其找出来,能用自己的话说清梦理由#include #include using namespace std; class Box { public: Box(int h,int w,int l):height(h),

迂者-贺利坚的专栏 4005

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++学习笔记34:类模板与派生、友元、静态成员变量

1 类模板与继承 -- 类模板从类模板派生(mubanpaisheng1.cpp) /** * 类模板从类模板派生 */ #include <iostream> using namespace std; template <class T1, class T2> class A { T1 v1; T2 v2; }; templ...

longbatianxia1的博客 308

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

静态成员,友元,模板

静态成员 同类的多个成员实现数据共享(全局变量破坏封装性,但静态成员要注意作用域) ●静态数据成员 1.只能在类体外初始化,通过类名引用(而不是对象) 2.在类外可以用对象引用公共静态数据成员,也可用类名引用静态数据成员 3.私有静态数据成员必须通过公共成员函数引用(公共成员函数可以引用静态和非静态数据成员) ●静态成员函数 1.可被对象或者类调用(一般用类Box::) 2.静态成

qq_37506789的博客 445

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C++:02.类与对象:struct于class,拷贝构造,静态成员,常对象,嵌套类,友元,类模板

struct与class: 在C语言中struct定义结构体,在C++中struct与class都是定义类,区别在struct默认public,class默认private。还有一种说法:没有成员函数的 struct 还是称作“结构”,结构变量不是对象;有成员函数的 struct 就是类。 在.c文件中访问结构体,不可以省略struct typedef struct Node { int...

V的博客 727

c++数字数组、字符数组(字符串)、数组作函数参数-lesson6

1. 数组的定义:所谓数组就是用一个统一的名字代表这一批数据,而用序号和下下标来区分各个元素,包含数字数组(标题2、3)和字符数组(标题4) 2. 一维数组 1)定义:类型 数组名[常量表达式],类型表示数组内的数据最小单位 2)初始化(定义的时候) a.定义的时候全部赋值:a[3] = {1, 2, 3}; b.可以部分赋值,其他默认为0:a[4] = {1,2}; c.对全部赋初值,可以不指定数组长度:a[ ] = {1,2}; #include "stdafx.h" #include<iost

rushberry的博客 1973

c++/c中putchar/getchar、printf/scanf、预处理、文件--lesson9

文章目录前言一、数据的输入和输出1.字符的输入和输出2.字符串的输入和输出3.格式输入和输出二、预处理1.预处理命令的内涵2.宏定义3.文件包含4.条件编译三、文件1.引入库总结 前言 这一篇文章的是对C/C++中一些常用的功能进行介绍,至少嵌入式上还是很有用的,以此作为C结束,C++正式开始的标志。 一、数据的输入和输出 在讨论输入和输出的时候,是针对计算机来说的,例如键盘和显示器。 需要说明的是本身标准C语言是不没有和输入输出相关的语句的,但是各个编译系统厂家(或者软件厂家)根据客户的要求结合

rushberry的博客 717

c++输入输出流和C++工具-lesson15

文章目录前言一、多态性的概念二、预备知识、思考、目的和使用方法总结 前言 之前的内容是面向对象-基于对象的程序设计,现在开始面向对象-面向对象的程序设计,首先是面向对象的另一个主要特点:多态。 一、多态性的概念 二、预备知识、思考、目的和使用方法 总结 这一节的内容有点多,重点和难点是继承和多态,多多练习。 ...

rushberry的博客 591

c++运算符重载--lesson12

文章目录前言一、构造函数、析构函数1.构造函数(数据成员初始化)2.析构函数(在撤销对象所占内存之前的一些任何操作)二、对象的数组、对象的指针1.对象的数组2.对象的指针三、共用数据的保护1.常对象(在定义对象的时候对所有的数据成员作了限制)2.常对象成员(在声明类的时候对某些数据成员和成员函数作了限制)3.指向对象的常指针4.指向常对象的指针5.指向常对象的常指针(前面两者的结合)6.指向对象的常引用7.指向常对象的引用8.指向常对象的常引用四、对象的动态建立(new)和释放(delete)五、对象的赋值

rushberry的博客 434

c++多态和虚函数(面向对象程序设计)-lesson14

文章目录前言一、多态型的概念二、基本知识1.目的2.继承和派生3.多级派生4.小结一下三、单继承之构造函数和析构函数1.单继承单层派生-不带子对象的构造函数2.单继承单层派生-带子对象的构造函数3.单继承多层派生-带子对象和不带的构造函数4.构造函数小结5.析构函数1.使用方法2.构造函数和析构函数3.多重继承的存在二义性问题4.虚基类5.思考五、重载(overload)、覆盖(override)以及隐藏六、基类和派生类的转换1.前提2.基类和派生类之间的赋值兼容3.后续七、继承和组合1.区别2.定义3.注

rushberry的博客 364

c++常量和变量-lesson3

计算机处理的对象是数据,数据包括常量和变量,它是以某种特定形式存在的,C++可以使用的数据类型包括以下,数据结构是数据的组织形式,包括数组、表、树、栈等。 常量的分类–文字常量(Literal Constant)和常变量(Constant Variable) 文字常量 文字常量又称为“字面常量”,包括数值常量、字符常量和符号常量。其特点是编译后写在代码区,不可寻址,不可更改,属于指令的一部分(注意与后面的字符串常量的区别) 1)数值常量:包括整型常量和实型常量(注意整形常量没有无符号的说法),编译系统根

rushberry的博客 349

c++函数、变量和头文件的使用-lesson5

变量 常量 表达式 局部变量定义的时候初始化相当于两条指令—变量(定义性)声明语句和执行语句(赋值语句) 全局变量的定义的时候初始化? 函数声明(也叫函数原型) 函数(function–功能,以此一个函数就是一个功能) ①一个大的程序包含若干个程序模块(程序文件.cpp),每个模块实现一部分功能,c语言主要的部分是函数,所以又称做面向函数的语言;c++基于过程的设计沿用了c语言,而c++面向对象的程序设计,主函数以外的函数大多是封装在类中,主函数或者其他函数通过类对象调用类中的函数。 ②函数的分类: a)

rushberry的博客 333

c++继承和派生(面向对象程序设计)-lesson13

文章目录前言一、入门基本概念1.基于过程的程序设计、基于对象的程序设计、面向对象的程序设计的区别2.类、对象、封装、抽象、继承、多态3.类和对象的作用4.面向对象的软件开发二、类和结构体的前世今生1.两者的异同2.类类型和对象的定义三、类的成员函数、对象成员的引用、公共接口和私有实现分离、类的声明和成员函数的分离1.类的成员函数2.对象成员的引用3.公共接口和私有实现分离4.类的声明和成员函数的分离四、面向对象的程序设计的几个名词五、简单的程序设计入门总结 前言 之前的内容是基于过程的程序设计,现在开始

rushberry的博客 288

c++指针和引用--lesson7

文章目录前言一、指针1.指针是什么2.指针变量1.引入库1.引入库1.引入库1.引入库二、引用1.引入库1.引入库1.引入库1.引入库1.引入库1.引入库2.读入数据总结 前言 指针是c/c++的重要概念,必须掌握! 提示:以下是本篇文章正文内容,下面案例可供参考 一、指针 1.指针是什么 1)程序经过编译之后已经将变量名转换为变量的地址,对变量值得存取都是通过地址进行的 2)直接存取和间接存取 3)指针:一个变量的地址称为该变量的指针,所以变量的指针就是变量的地址; 指针变量:一个存储指针(地址).

rushberry的博客 274
上一篇: c++我来了--lesson10
下一篇: c++运算符重载--lesson12
_Raspberry_
博客等级 码龄10年 62粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值