C++笔记

C++总结笔记 / ++操作 这是因为定义的数组,申请的是连续的内存空间,当ptr++(ptr是int类型的指针变量),地址空间向后偏移是以int类型的大小为单位进行偏移的,相当于int类型数组元素的向后偏移。使用场景:它是最通用的转换形式,用于将一种类型转换为另一种类型,例如基本数据类型的转换(如 float 转 int),指向基类的指针或引用转为指向派生类的指针或引用等。在派生类被调用时会调用派生类中的函数,不会调用基类中的被重写的函数(基类中的函数需要加上virtual才可以,即基类中的函数是虚函数)。 阅读详情

 函数返回值时,要生成一个值的副本。而用引用返回值时,不生成值的副本

Float temp;

Float fn1(){

       Reurnntemp;

}

Float & fn2(){

       Reurntemp;   //注意返回引用的用法

}

Int main(void)

{

       Floaa = fn1(5.0);   //1

       Float&b = fn1(5.0);  //2 warning

       Floatc = fn2(5.0);  //3

       Float&d = (5.0);   //4

}

1中,C++会在栈中创建一个临时变量并将temp的值复制给该变量。然后在主函数中,a=fn1(5.0)再把临时变量复制给a

2中,同样会在栈中生成一个临时变量,再在主函数中用该临时变量初始化引用。根据C++标准,该临时变量会在b=fn1(5.0);后消失,所以b引用的值是无法确定的。BC对C++的标准做了扩展,规定临时变量与引用的生命周期一样。所以该语句依赖编译器,可移植性差。

3中,fn2()返回一个引用,不会产生临时副本。在main中直接把temp的值直接初始化引用c

4中,fn2()返回一个引用,直接用该引用来初始化d,且d为全局变量temp的别名。Temp生命周期会在整个程序运行期间。如果temp为全局变量就有问题了。

 

只要避免将局部就是的地址返回,就能使函数调用表达式作为左值来使用。这样就可以直接对返回进行操作

Lenvl(array[i], 10, typeA, tpyeB)++;

Int & level(int grade[], int size, in&tA, int &tb){

       If(sum> 80)

              ReurntA;

       Else

              ReturntB;

}

 

一.Const限制

a)      没有区分const引用和const变量引用,因为变量的指向本来就是const的。

没有const double cons &a = 1;,只有const double &a = 1;

 

二.函数

l  内联函数

函数的调用需要建立栈内存环境,传参。保护上下文等,需要开销。对于一个短且调用频率高的函数会消耗太多资源。应该使用内联函数。以牺牲代码空间来节省函数调用的开销,内联函数使用不当就会造成代码膨胀

Inline intisnumber(char );            //声明与定义必须配套,否则当普通函数处理

Inline int isnumber(charc){

 

}

与宏相似,但有函数的样子,可以解决宏的二义性。还可以函数成员变量

注意事项:1.在内联函数内不允许用循环语句和开关语句。 如果内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码,递归函数(自己调用自己的函数)是不能被用来做内联函数的。内联函数只适合于只有1~5行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对来说微不足道,所以也没有必要用内联函数实现。 2.内联函数的定义必须出现在内联函数第一次被调用之前。 3.本栏目讲到的类结构中所有在类说明内部定义的函数是内联函数。

 

l  重载函数

对于在不同类型上作不同运算而又用同样的名字的情况,被视为重载。

a)      调用方法:将实参类型和所有被调用的函数的形参类型一一比较。顺序为:

(1)       寻找一个严格的匹配,如果找到了,就用那个函数

(2)       通过内部转换寻求一个匹配,只要找到了,就用这个函数

(3)       通过用户定义的转换寻求一个匹配,若能查出一个唯一的一组转换,就用那个函数

C++允许int到long, int到double的转换。当实参是整数,而重载函数为一long形参数,一为double型参数时,应该给以一个显式转换

Voidprint(long);

Void print(double );

Void func(inta){

      Print(a); //error 因为有二义性; 应该指明是print(long(a)),还是print(double(a));

}

b)     重载的使用说明

1.      C++的函数如果在返回类型,参数类型,参数个数,参数顺序上有所不同,不构成重载

2.      让重载实现不事的功能是不好的编程风格

c)      重载的内部实现

C++采用名字粉碎法(name mangling)来改变函数名,以区分不同的同名函数

Int f(char a);

Int f(char a,int b, double c);

用上面的方法表示后f_c,  f_cid

三.默认参数的函数

a)        默认参数的目的:容错性更强,利于反复调用

b)       默认参数的声明:当又有声明又有定义时,定义中不允许出现默认参数,应该在声明出给了默认值。如果函数只有定义,则默认参数才可以出现在函数定义中

c)        默认参数的传参顺序

默认参数应该从右到左逐渐定义

Void func(int a= 1, int b, int c=3, int d=4); //error

Void func(int a,int b = 2, int c=3, int d =r); //OK

Func(12, 12)//OK 参数C和D有默认

Func(2, 15, ,20) //error参数只参从右到左顺序匹配默认

d)       默认参数可以把一系列简单的重载函数合成为一个

Void point(int,int) {…}

Void point(int){ …}

Void point() {…}

可用下面的来代替:void point(int = 3, int = 4);

e)        默认值不可以是全局变量,因为默认值是在编译时确定的,而局部变量在编译时无法确定值

 

四.类

a)        C和C++结构体的区别

                       i.             假如Savings为结构体:在C中定义的方法是structSavings a; 在C++中是Savings a;

                     ii.             C++的类既能包含数据成员和成员函数

                   iii.             C++类的限制关键定是:public, protected, private

                    iv.             C++的结构体中的变量默认是Public,便可以加private做限制。类中默认的是private的

b)       ::属于域区分符。可以指明方法或变量属于哪个类。可以不跟类名,表示全局数据

c)        在类中定义的成员函数一般都比较小,语句只有1~5句。特别的是不能使用switch语句。一般默认为内联函数,即使没有使用inline

d)       在类外进行函数定义

//Table.h

Class Table {

       Public

              Void set(…);

}

//table.cpp

Void Table::set(…){…}

e)        在本类的方法中调用本类的方法和变量无需加对象名或者类名,因为在使用变量或方法的时候相当于有一个this指针,指向被调用的变量或方法。

f)        可见性

Class Sample {}

Void func(intsample){ class Sample a; Sample++ }

Int s = 0;

Void func(){

       Class s{};

       S a;  //定义一个类对象

       ::S = 3;   //引用全局变量;

}

 

五.构造析构函数

a)        构造函数

                       i.             每个类必须有一个构造函数,如果没有,则使用默认构造函数。提供了构造函数后就不再提供无参的默认构造函数,除非已经定义了无参构造函数,否则无法使用无参构造函数

                     ii.             除了全局变量或静态变量外,对象的其他变量为随机值

                   iii.             在类内的变量只是一个声明,并非定义一个变量。假如,一个D类没有默认构造函数,在E类中定义变量D d;是可以的。而在函数中定义D d; 会调用D的默认构造函数,则产生错误。也不允许在类中D d = 9818;

                    iv.             在外部定义是需要加类名::类名();

                      v.             不可以有返回值,也不可以有void

                    vi.             可以Tdate dday(1,2);  Tdate dday; 但不可以 Tdate dday(); 这样是定义了一个名字为dday,返回值为Tdate的函数。Tdateoneday(int); 为声明对象。Tdateoneday(10);为创建对象

                  vii.             由于构造函数用于创建对象,所以调用它来给对象赋值是错误的

                viii.             使用默认参数可以合并多个类似的函数

                    ix.             重载构造函数若与参数默认值的构造函数发生冲突,则创建对象的语句会导致编译错误

Tdate(int d) {…};  与 Tdate(int m, int 12) 造成冲突

                      x.             在单继承的情况下,会先创建父类,如果B继承A,C继承B,如果实例化C,则构造顺序是ABC。

                    xi.             同一个类继承多个同级的类时,按继承顺序从左到右创建父类,再创建本类。

                  xii.             如果B继承A,C继承B,在C类中包含对象A,D。则创建顺序是,先AB,再按变量列表的顺序构造变量A,D,即使有默认参数列表也会按照定义的顺序分配。最后构造本类C。因为要先知道AD的内存大小才好分配自身内存大小

                xiii.             对类中的对象或变量进行赋值和初始化可以采用默认参数列表,Student(…, int sid):id(sid),其中,id为类中的D id;对象。而在构造函数里面就不是初始化,无法对引用或常量进行赋值,不可以Student(…, int sid):id=sid

                xiv.             对一个变量赋值有以下方式

Main(){

int m=10;

       int n(20); //TC+3.0不允许,C++新标准允许

       n(20);     //不是赋值,是调用n函数

Student s = “Jenny”;

Student t(“Danny”);

}

 

                  xv.             程序中的局部变量并不是由运行的顺序决定的,是在程序运行前已经统一定义了

                xvi.             静态对象只被构造一次,文件作用域的静态变量在主函数开始运行时已经被构造完毕,块作用域的在首次运行时被构造

              xvii.             所有的全局对象都在main函数之前被构造,但是如果该对象有一个错误,则无法得到控制权,导致程序BUG。解决这种方法有:一是将全局变量作为局部变量调试,二是打印出来观察

            xviii.             全局对象构造时无特殊顺序,所以不能是一个全局变量赋值给另一个全局变量

b)       析构函数

                       i.             ~类名();

                     ii.             没有返回类型,也没参数,也没有重载

 

六.动作内存分配

a)        C++程序的内存格局通常分为四个区:

                       i.             数据区(data area):静态变量为一个区,全局变量为一个区,只读数据区,未定义数据区

                     ii.             代码区(code area):

                   iii.             栈区(stack area):局部变量,函数参数,返回数据,返回地址等存放在栈区

                    iv.             堆区(heap area)

b)       不用用malloc的原因是,malloc只分配空间,而类的建立是集空间分配,构造结构,以及初始化为一体

pD = (Tdate*)malloc(sizeof Tdate); p从malloc()中获得的是一个非法数据的类对象,对应的对象空间不确定。可以再调用内部接口p->setTdate()来初始化。但不实际

c)        New不用显示指明指针类型,且自动调用构造函数。

pD=new Tdate(1,1, 1998);  delete(pd);

pS= newTdate[10];  delete[] pS; //new数组时只能传个数,不能传参,只能调用默认构造函数。且释放的时候要写[],否则会产生错误,如果[]里面写了大小,则编译器会把他忽略

d)       New一个整形数组的方法 int *v = new int[10];

 

七.拷贝构造函数

a)        拷贝函数的样式:类名(类名 & s)

b)       多处用到拷贝构造函数,如:Student s2=s1;. Void fn(Student fs){ return  fs}; Student s = fn(u);

c)        为什么要用到拷贝构造:因为对象的复制不仅是二进制内存的复制,还有些对象资源或者有一些对象包含系统资源。用拷贝函数,新旧两个对象就一起共用了这个资源,有可能造成资源管理混乱

d)       浅复制:只作了变量的拷贝,资源不拷贝

e)        深复制:资源的拷贝,并把新的变量指向新的资源

 

八.无名对象

Void fn(Student&s);

Int main()

{

       Student a=Student(“Randy”); //并不是无名对象,而是调用初始化构造一个变量。与Student a(“Randy”);类似

       Student &refs = Student (“Randy”);  //可以初始化引用

       Student s = Student(“Jenny”);              //初始化对象

       Fn(Student(“Dany”));   

       Return 0;

}

第一个中,无名对象产生在main栈空间,他完全等价于Student refs=”Randy”; ???

第二个,用无名对象拷贝构造一个对象S,先调用构造函数再调用拷贝函数等价于 Student refs=”Randy”;

第三种,先创建一个无名变量,再复制到形参

//  int &i=1;//不能用非对象去初始化一个引用。 ???
    const int &j=1;//这样可以,但是没什么实际意义
    string str("haha");
    test(str);
    test_const(str);

//    test(string("haha"));//invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string'。使用临时对象不能初始化test的string & 引用。
    test_const(string("haha"));//使用临时对象初始化函数形参的时候,函数形参必须是有const限定。

九.构造函数用于类型转换

a)        基本操作中,5/8与5.0/8不同,5.0/8匹配了double类型的除法。

b)       C++会进行试探性转换,尝试构造一个类。如:

void fn(Student &s);

void main() {

       fn(“Jenny”); //从String到Student类型的转换,C++会自动寻找Student(char *)构造函数

}

c)        但是要注意两点

                       i.             只会尝试含有一个参数的构造函数;

                     ii.             如果有二义性,则放弃尝试,如果void addCourse(Student &s)与void addCourse(Student &s);有二义性。只要显示转换一下即可addCourse(Teacher(“Prof.Dingleberry”))

十.静态成员的使用

a)        在对象空间中,没有静态成员的存在,不会随着对象的分配或析构。所有相同的类都共享一个静态成员

b)       在类中,定义静态成员:static int noOfStudent; //不可写成noOfStudent

c)        在类中,定义静态函数:static int number() { return noOfStudent }

d)       静态数据必须在一开始时就被初始化,不能在函数运行期间初始化。

e)        不能在头文件的类外部定义,这样会重复包含定义。

f)        不能在别的CPP中初始化,这样在另一个CPP中要再次初始化。

g)       可以在类的CPP下面初始化。也可以重用,如在Student.h中定义,在Student.cpp中初始化。Int Student::noOfStudent  = 0;

h)       静态数据不属于哪个对象。公共静态数据成员可以被类的外部初始化,保护或私有静态数据成员只可被类的内部访问。公共静态成员的访问方法Student::noOfStudents, 不能用Student.noOfStudent

i)         下面的代码用返回对象引用的成员函数作为对象值去操作静态成员,但是静态成员只取返回对象的类型,其成员函数未被执行。引用静态成员时,C++只关心静态成员的类的类型

Class Student {

       public:

              staticint noOfStudents;

              Student &nextStudent() {

       noOfStudent++;

       return this;

}

}

Void fn(Student&s) {

Cout<<s.nextStudent().noOfStudent<<endl;

}

Ina main() {

       Student ss;

       Fn(ss);

}

十一.       静态成员函数

a)        与静态成员变量类似。如果用对象去引用静态成员函数,只是用其类型。

b)       一个静态成员函数不与任何对象相联系,故不能对非静态成员变量进行访问。

Static char*sName() {   //静态成员函数只认类型,与静态变量类似

       Cout << noOfStudent <<endl;

       Return name //访问非静态成员,不知道该成员属于哪个对象

}

c)        静态函数可以通过静态变量去访问内部数据,如pNext为静态变量,可以通过pNext->next去访问

d)       静态成员函数与非静态的区别在于,非静态有this指针指引,静态与对象无关,s1.findName(“jenny”),与Student::fineName(“jenny”);结果一样

Class Sc {

       Public:

              Void nsfn(int a); //像声明Sc::nsfn(Sc *this, int a);

              Static void sfn(int a); //无this指针

}

Void f(Sc&s){

       s.nsfn(10); //转换为Sc::nsfn(&s, 10)

       s.sfn(10); //转换为Sc::sfn(10)

}

 

十二.       友元

a)        需要友元的原因:普通函数需要直接访问类的保护或私有的保护或私有数据成员的原因主要是为提高效率

b)       需要友元的另一个原因是方便重载操作符的使用

c)        在类的内部声明:

Class Student;//前向声明类名声明

Class Vector {

       Public:

              Void assignGrade(Student &s);

              Friend Vector Multiplay(Matrix&m, Vector &v); //可在public区,也可以在protected区,完全一样

}

d)       一个类的成员函数可以是另一个类的友元

Class Student {

       Public:

              Friend void Vector::assignGrade(Student&s);;

}

VoidVector::assignGrades(Student &s) {

       s.gpa = 4.0, //可以修改Student里面变量

}

e)        整个类可以是另一个类的友元,该友元称为友类。如,老师既可以修改成绩,又可以调整学时数

Class Student {

       Public:

              Friend class Teacher; //友类

}

Class Teacher {

       Public :

              Void assignGrades(Student &s);  //修改成绩

              Void adjustHours(Student&s);  //修改学时数

}

十三.       继承

a)        Class GraduateStudent: publicStudent

b)       派生类对象无法直接访问基类的资源。可以在派生类的方法中使用基类的资源

c)        继承的转换,

void fn(Student &s) {}

void main() {

GraduateStudent gs;

fn(gs);     //相当于做了Student(gs)的类型转换。注意类型转换的方式,是否可见域也会发生改变??

}

d)       一般不会直接访问基类的数据,而是通过接口进行相互的数据交流

e)        同样是因为要知道基类占用内存大小,派生类会首先初始化基类,如果基类无法构造则造成错误。对基类数据成员的构造及初始化:

classGraduateStudent: public Student {

       public:

              GraduateStudent(char *pName,Advisor &adv)

                     :Student(pName),advisor(adv)  //初始化adv会通过拷贝函数把值复制给advisor

}

f)        析构的顺序与构造顺序相反。先调用GraduateStudent,再析构advisor,最后析构Students

 

十四.       抽象类(abstract class)

a)        这样的类的唯一用途就是被继承,一个抽象类至少有一个纯虚函数。

b)       纯虚函数(pure virtual function)指不具体实现的虚成员函数

Virtual voidWidthdrawal(float tamount) = 0; // =0表明不定义该函数。为派生类保留位置。在派生类中也同样要声明虚函数,不加=0。定义加了0为纯虚函数。不加0为虚函数,可以在子类中不重写,直接调用

c)        一个抽象类不能有实例对象,即使不能由该类抽象来制造一个对象

Class Display {

       Public:

              Virtual void init() = 0; //纯虚函数

              Virtual void write(char *pString)= 0; //纯虚函数

}

ClassMonochrome: public Display {

              Virtual void init() ;               //继承了init函数进行重写

              Virtual void write(char *pString);       //继承了write函数进行重写

}

ClassColorAdapter: public Display {   //彩色显示器,

       Virtual void write(char *pString) ;       //继承write函数进行重写,但无法确定各种彩色显示器如何INIT的

}

ClassSVGA:public ColorAdapter {      //VGA系列彩色显示器

Virtual void init();                       //继承了ColorAdpter显示器写的方法,但是针对某种特定的SVGA,

                                                 //提供了不同的init方法

}

VoidMonochrome::init() {//省略

}

VoidMonochrome::write(char *pString) {

}

VoidColorAdapter::write(char *pString) {

}

VoidSVGA::init() {

}

十五.       多重继承

a)        多重继承class SleeperSofa :public Bed, public Sofa 

b)       C++继承的模糊性,假如Bed和Sofa都有一个weight,那该继承谁的呢。使用方法:ss.Sofa::SetWeight(20);因些程序员除了知道接口外,还要知道他的内部结构,不方便使用。

 

十六.       继承的访问权限

 

十七.       虚拟继承

a)        床和沙发都属于家具,且都有重量和设置重量显示重量的方法,沙发和床都继承了家具,同时沙发床又继承了沙发和床。所以对家具就有再次继承,编译不通过。C++提供了虚拟继承,保证相同的部份只有一个

Class Bed:virtual public Furniture { } 

class Sofa:virtual public Furniture { }

class SleeperSofa:public Bed, public Sofa { }

b)       加上virtual 说明,如果没有Furniture类,则加入一个Furniture拷贝,否则就用一个

 

派生类的三种继承方式

       公有继承public)、私有继承(private)和保护继承(protected)是常用的三种继承方式。

       1.对于公有继承方式:
       基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。这里保护成员与私有成员相同。
       基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员可见:基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态;基类的私有成员不可见:基类的私有成员仍然是私有的,派生类不可访问基类中的私有成员。
       基类成员对派生类对象的可见性对派生类对象来说,基类的公有成员是可见的,其他成员是不可见。
       所以,在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。

       2.对于私有继承方式:
       基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。
       基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员是可见的:基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问;基类的私有成员是不可见的:派生类不可访问基类中的私有成员。
       基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的。
  所以,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。

       3.对于保护继承方式:
  这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生类的成员而言,
       基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。
  基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员是可见的:基类的公有成员和保护成员都作为派生类的保护成员,并且不能被这个派生类的子类所访问;基类的私有成员是不可见的:派生类不可访问基类中的私有成员。
  基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的。
  所以,在保护继承时,基类的成员也只能由直接派生类访问,而无法再往下继承。

       公有继承(public)
       ①继承后基类的公有成员、私有成员、保护成员在派生类中访问权限保持不变。
       ②在派生类中可以直接访问基类的公有成员和保护成员,但对于私有成员的访问只能通过基类的非私有成员函数间接访问。
       ③在基类和派生类定义以外只能通过派生类的对象访问基类的公有成员,无法通过派生类对象直接访问基类的私有成员和保护成员。

       私有继承(private)
       ①继承后基类的所有成员在派生类中均为私有成员。
       ②在派生类中可以直接访问基类的公有成员和保护成员,但对于私有成员的访问只能通过基类的非私有成员函数间接访问。
       ③在基类和派生类定义以外对基类的所有成员均无法直接访问也无法通过派生类的对象间接访问。

       保护继承(protected)
       ①继承后基类的公有成员和保护成员在派生类中均为保护成员,基类的私有成员在派生类中仍为私有成员。
       ②在派生类中可以直接访问基类的公有成员和保护成员,但对于私有成员的访问只能通过基类的非私有成员函数间接访问。
       ③在基类和派生类定义以外对基类的所有成员均无法直接访问也无法通过派生类的对象间接访问。

 

十八.       多重继承的构造顺序

a)        构造对象的规则需要扩展以控制多重继承。构造函数按下列顺序被调用:
(1)任何    虚拟基类的构造函数按照它们被继承的顺序构造;(#add 即声明顺序)
(2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;
(3)任何成员对象的构造函数按照它们声明的顺序调用;
(4)类自己的构造函数。

 

十九.       赋值兼容规则和多态

a)        赋值兼容规则中所指的替代包括以下情况

                       i.             公有派生类的对象可以赋值给基类的对象,即将公有派生类对象中从基类继承而来的数据成员逐个赋值给基类对象的对应数据成员;

                     ii.             公有派生类对象的地址可以赋值给基类的对象指针;

                   iii.             公有派生类对象可以用来初始化基类的对象引用。

b)       在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承成员

c)        赋值兼容有局限性,而多太的设计方法可以保证在赋值兼容的前提下,基类、派生类分别以不同的方式来响应相同的消息。

d)       运行过程中的多态需要满足三个条件:首先类之间应满足赋值兼容规则,其二是要声明虚函数,第三是要由成员函数来调用或者是通过指针、引用来访问虚函数。

e)        如果派生类没有显示给出虚函数声明,这时系统就会遵循以下规则为判断一个函数是否为虚函数

                       i.             该函数是否与基类的虚函数有相同的名称

                     ii.             该函数是否与基类的虚函数有相同的参数个数及相同的对应参数类型

                   iii.             该函数是否与基类的虚函数有相同的返回值或者满足赋值兼容规则的指针,引用型的返回值

                    iv.              

C++之yaml-cpp开源库的使用笔记 参考博文:Cpp(十一) yaml-cpp的使用 参考博文:yaml-cpp的使用 step1 git clone https://github.com/above/yaml-cpp cd yaml-cpp mkdir build cd build cmake .. make sudo make install 安装后,库文件和头文件路径: 头文件: /usr/local/include/yaml-cpp 库文件: /usr/local/lib/libyaml-cpp.a CMakeLists 阅读详情

相关推荐

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图:Discuz X3.5的系统信息,上传许可为1024MB(1GB)论坛为局域网论坛,仅供内部同事交流使用!使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图:选择上传附件(提示可以最大上传100M) 下图:模拟上传84M的文件(

骚团长的博客 1828

《ACM竞赛-C/C++入门》 C语言-19

尹成老师带你步入C语言基础的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以C语言为核心,完整精彩的演练了C语言操作流程以及各种精彩的小项目等,提高竞赛能力,非常适合同学们学习!

VoIP概述

VoIP统一通信与VoIPVoIP与传统电话比较VoIP各项产品设备的类型及应用 统一通信与VoIP 统一通信指的是把计算机与传统通信技术统一成一体的新通信模式,融合计算机网络与传统通信网络在一个网络平台上,实现电话、传真、数据传输、音视频会议、呼叫中心、即时通信等众多应用服务 VoIP又称IP电话或IP网络电话,是Voice Over IP的缩写,这种技术通过对语音信号进行编码数字化,压缩处理成压缩帧,然后转换成为IP数据包在TCP/IP网络上进行传输,从而达到了在IP网络上进行语音通信目的 VoIP与传

kaminao的博客 4358

C++函数副本机制研究&函数返回值与拷贝构造的浅拷贝和深拷贝的关系

C++函数的副本机制到底是怎么一回事呢?我们可以先从函数返回是Void类型,指针类型,引用类型逐渐过度到返回值是类型对象引起的副本机制 首先通过函数返回值是Void类型的研究 #define _CRT_SECURE_NO_WARNINGS #include using namespace std; class MyString{ public: char* pstr; in

2359Coding 2032

新手也能搞定的ANPC三电平逆变器Simulink仿真:从SPWM调制到开关损耗优化

本文详细介绍了如何在Simulink中搭建ANPC三电平逆变器仿真模型,从SPWM调制基础到开关损耗优化技巧。通过分层设计思路和实用代码示例,帮助新手快速掌握ANPC拓扑的核心功能,包括中点平衡控制和性能指标分析,为电力电子系统设计提供实践指导。

weixin_30335575的博客 407

计算机网络技术研究方向有哪些创新点

计算机网络技术方向的创新点众多,这些创新不仅推动了网络技术的不断发展和完善,还为用户提供了更高效、更安全、更便捷的网络服务。- 边缘计算是一种将计算和数据存储推向网络边缘的技术,通过将数据处理和分析的任务分散到网络的各个节点,降低了数据传输的延迟,提高了实时性。- 通过网络自动化工具和技术,可以实现网络配置的自动化、网络故障的自动诊断与修复等功能,降低了网络运维的复杂性和成本。- 通过引入人工智能技术,网络可以实现更智能的流量管理、故障预测和自动修复等功能,提高了网络的性能和稳定性。

Loving_enjoy的博客 1495

C语言编程基础

一、变量是什么? 变量就是对一块内存进行标记的标识符: (1)英文+数字+下划线(个人倾向使用小写加大写开头单词组合 不使用下划线);(2)不要和系统命名冲突 变量存储在哪里? 变量的标识其实就是存放在可执行文件对应的段内:__text,__data,__bss 变量对应的内容存放在系统当中的内存区域中 (1)bss段的数据为未初始化的全局变量 (2)data段的数据为程序中已初始化的全局变量 (3)stack段的数据为程序临时创建的局部变量 二、运算符 1.运算符是完成变量或表达式进行运算的符号 (1)运

oruchimaru0420的博客 337

极验点选click3.1.0所对应fullpage.js的逆向分析

极验3代点选验证,本文适用于使用click.3.1.0.js和fullpage919-eyz9lh.js版本的web验证码,没有细节内容,适合有基础的开发者阅读。

shanf7921的博客 648

函数的副本机制(函数返回值的生命周期)

函数的副本机制(函数返回值的生命周期)

KnowBug 1815

YOLOv8【第十二章:数据增强与数据工程篇·第10节】主动学习(Active Learning):如何挑选最有价值的样本进行标注!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 508

YOLO26改进策略【多YAML融合】| UNetV2 + BiFormer + WIoU

Wise-IoU是一种基于IoU的损失函数,旨在解决目标检测中边界框回归损失函数在处理低质量训练数据时的问题。

Limiiiing的博客 218

C++返回对象与引用

C++返回对象与引用 其实,大家在写C++代码的时候,都会发现,有些函数的返回是引用,有些函数发的返回是对象,今天我们一起来做一下区分。 1.根源 返回对象和返回引用的最主要的区别就是函数原型和函数头 看一下例子: Test get(const Test&) //返回对象 Test& get(const Test&) //返回引用 2.操作性 这里的操作性指的是在...

Travelerwz的博客 3399

基于STC8G1K08A单片机的PCA捕获外部信号(100~1000HZ)程序实现

基于STC8G1K08A单片机的PCA捕获外部信号(100~1000HZ)程序实现

weixin_74013772的博客 254

C++Primer Plus学习笔记

此博文是通过翻阅C++ Primer Plus中文第6版(2020),逐章学习记录笔记由此学习C++的基础特性和语法知识,有别于其它视频教学+代码+笔记的学习途径,更趋向传统的书籍+代码+笔记学习,Cpp第6版以C++11标准为主,学习C++基础编程绰绰有余.

weixin_45068267的博客 3198

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++ 笔记 yaml-cpp 的使用

yaml-cpp 是一个开源库,地址为 https://github.com/jbeder/yaml-cpp 具体安装配置可参考以下博文: https://www.cnblogs.com/huodaozhe/p/12026327.html https://blog.youkuaiyun.com/briblue/article/details/89515470 Yaml的语法可参考教程:http://w...

flyconley的博客 2169

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[cpp]C++笔记

#include <iostream> using namespace std;int main(){ char c = 'a'; char *p; p = &c; char **q; q = &p; printf("%p\n", q); printf("%p\n", *q); printf("%c\n", **q); cout <

cn_wk的专栏 270

CPP/C++学习笔记04

主要内容:初始化列表、隐式类型转换、匿名对象、static成员、友元函数&友元类、内部类和拷贝对象时的一些编译器优化

qq_48637306的博客 507

c++学习笔记(1)-devcpp软件安装和第一个cpp程序

windows环境参考:直接从官网下载最新版即可。

在读控制专业学习笔记 286

CPP/C++学习笔记02

主要内容:关于基础语法的笔记。auto、范围for、访问限定符、this指针、构造函数、析构函数、拷贝构造函数和const引用

qq_48637306的博客 445

探索 Cherno 的 C++ 笔记:一次深入学习的旅程

探索 Cherno 的 C++ 笔记:一次深入学习的旅程 项目地址:https://gitcode.com/gh_mirrors/ch/Cherno-CPP-Notes 项目简介 在编程世界中,优秀的学习资源是提升技能的关键。 是一个由著名游戏开发者和教育者 The Cherno Project 制作的 C++ 学习笔记仓库。这个项目旨在为初学者和有经验的程序员提供一个全面、易懂且实时更新的 C+...

gitblog_00004的博客 771

C++学习笔记(七)——log4cpp

C++学习笔记(七)——log4cpp log4cpp的下载与安装 1.下载log4cpp-1.1.1.tar.gz 2. 安装:先将log4cpp-1.1.1.tar.gz拖入用户主目录, 然后再执行以下步骤: $ sudo cp log4cpp-1.1.1.tar.gz /usr/local $ su # cd /usr/local # tar zxvf log4cpp-1.1.1.tar.g...

weixin_39828926的博客 519

探索现代C++编程的艺术:《CPP Notes》开源笔记

探索现代C++编程的艺术:《CPP Notes》开源笔记 去发现同类优质开源项目:https://gitcode.com/ 项目简介 在上,开发者wx-chevalier分享了一个令人眼前一亮的项目——。这是一份详尽且实践导向的C++学习笔记,涵盖了C++的基础知识到高级特性,旨在帮助读者深入理解并熟练运用这种强大而复杂的编程语言。 技术分析 1. 内容结构 CPP Notes遵循从易到难的原则,...

gitblog_00046的博客 546

CPP/C++学习笔记06

主要内容:模板

qq_48637306的博客 259

C++ 笔记(持续更新中)

C++ 笔记带详细CMake例程

VictorFz的博客 204

UE C++学习笔记之创建组件

UE C++学习笔记之创建组件

AgilityBaby的博客 2061

c++学习笔记

c++学习笔记

m0_72957178的博客 570
下一篇: MFC笔记
shell812
博客等级 码龄18年 202粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值