【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化
前言
本章就是我们C++中类与对象的终章了,不过本章的难度不大,都是类中一些边边角角的知识,记忆理解就行了,相信经过这么长时间的学习类与对象,你对面向对象也有了更加深的理解,最后我们学习完边边角角的一些知识点后我们再来一起谈谈类与对象的理解。
类与对象 (四)
- 一、 再谈构造函数
- 1、 初始化列表
- a.定义
- b.特性
- ①每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
- ②类中包含以下成员,必须放在初始化列表位置进行初始化:
- ③成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
- 2. explicit关键字
- 二、 static成员
- 1、定义
- 2、特性
- 3、练习
- 三、 友元
- 1、介绍
- 2、友元函数
- a.特性
- 3、友元类
- a.特性
- 四、 内部类
- 1、定义
- 2、特性:
- 五、匿名对象
- 1、定义
- 2、特性
- 六、拷贝对象时的一些编译器优化
- 七、 再次理解类和对象
一、 再谈构造函数
虽然在类与对象(二)中我们已经详细介绍了构造函数,但是我们在这里还是要继续谈论构造函数,因为构造函数实在是太复杂了(C++之父最开始没有设计好,后面又多次打补丁导致构造函数相当复杂),不过这次再谈论构造函数并没有像以前的那么难,我们这次谈论的是构造函数的一些碎片化知识。
我们还是先看代码再思考:
#include<iostream>
using namespace std;
class Date
{
public:Date(int year=10, int month=10, int day=10){_year = year;_month = month;_day = day;_a = 10; //编译失败,const修饰的变量不能改变}
private:int _year;int _month;int _day;const int _a;//编译失败,const 变量未初始化
};
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值,虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
你可能觉得这样抠细节是不是有些太钻牛角尖了,其实不是那样的,有些变量非常看重初始化,如const 修饰的变量只能初始化一次并且不能被赋值,这就要求我们必须仔细分清初始化与赋值。
我们对上面代码的成员变量加一个const修饰的变量看看会发生什么?

我们发现编译失败,难到类里面不能定义这种const修饰的变量吗?不是的,其实我们可以按照类与对象(二)中讲的缺省值给const变量赋值,但是缺省值是C++更新之后才出现的,那C++更新之前版本我们C++又是怎么解决的呢?
答案就是初始化列表!
1、 初始化列表
首先我们先思考一个问题对象定义时,对象中的成员是具体在哪里定义的呢?解决了这个问题上面的const修饰的变量不能定义的问题也就解决了,因为const修饰的变量在定义时必须初始化,即定义与初始化在一起。
答案是对象中的成员是具体定义是在初始化列表,那么下面就让我们一起了解一下初始化列表吧
a.定义
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
实例代码:
#include<iostream>
using namespace std;
class Date
{
public:Date(int year , int month , int day):_year(year)//初始化列表,也是成员变量定义的地方,这里才是真正的初始化,_month(month),_day(day),_a(10){}
private:int _year;int _month;int _day;const int _a;
};
int main()
{Date d1(10,10,10);return 0;
}

b.特性
①每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)

②类中包含以下成员,必须放在初始化列表位置进行初始化:
- 引用成员变量 (定义时必须初始化)
- const成员变量 (定义时必须初始化)
- 自定义类型成员且该类没有默认构造函数时(没有默认构造意味这初始化时必须传参)
- 我们先看自定义类型成员且该类没有默认构造函数时,我们不在初始化列表进行初始化

2.我们看自定义类型成员且该类有默认构造函数时,我们不在初始化列表进行初始化。

结论是:在初始化列表,如果我们什么都不写,编译器对内置类型不作处理,对自定义类型去调用它的默认构造。
建议:尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。
③成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
思考以下代码的结果:
#include<iostream>
using namespace std;
class A
{
public:A(int a):_a1(a), _a2(_a1){}void Print() {cout << _a1 << " " << _a2 << endl;}
private:int _a2;int _a1;
};
int main() {A aa(1);aa.Print();
}

可能结果让你大吃一惊,我们仔细分析一下

2. explicit关键字
构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。
注意:根据定义知这里的构造函数必须传参
我们看下面一段代码
#include<iostream>
using namespace std;
class A
{
public:A(int a):_a1(a), _a2(_a1){}
private:int _a1;int _a2;
};
int main() {A aa1(1); A aa2 = 1;//这里不是拷贝构造(拷贝构造是用一个对象初始化一个对象),//这里也不是赋值重载(赋值重载是用一个已经初始化的对象赋值给另一个已经初始化过的对象)//是否可以编译通过?return 0;
}
答案是可以编译通过并且通过监视我们可以看到它的值

那为什么这里能够通过编译呢?答案是隐式类型转化!
我们在讲解引用时曾经讲过之所以下面的代码能通过,是因为 i 会隐式类型转换为一个double类型的临时变量,且临时变量具有常性,d 引用的就是这个double类型的临时变量!
int i = 10;
const double&d = i;
同理这里也是,具体过程如下:

明白了单参数的类型转化赋值的原理后我们看看多个参数怎么做?
#include<iostream>
using namespace std;
class A
{
public:A(int a,int b):_a1(a), _a2(b){}
private:int _a1;int _a2;
};
int main() {A aa1(1,2); //调用构造函数A aa2 = {1,2}; //多个参数类型转化return 0;
}
这里我们可以看到多个参数是我们是用{ }来给值的

注意,单个参数转换是C++98支持的,多个参数转化是C++11支持的
但是有时候我们却不想让这种事情发生,这是就需要我们用explicit修饰构造函数,将会禁止构造函数的隐式转换。
同样的代码我们加上explicit

到这里我们总算是将构造函数讲完了…之后还要多多复习啊!
二、 static成员
1、定义
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。
静态成员变量一定要在类外进行初始化!因为初始化列表只能初始化非静态成员
实例代码:
#include<iostream>
using namespace std;
class A
{
public:A():_a(10),_b('a'){}
private:int _a;char _b;static int c;//这里不能给缺省值,缺省值是给初始化列表使用的,//初始化列表只能初始化非静态成员
};
int A::c = 10;
int main()
{A aa;return 0;
}

2、特性
- 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
- 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
- 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
- 静态成员也是类的成员,受public、protected、private 访问限定符的限制
- 静态成员函数没有隐藏的this指针,不能访问任何非静态成员

3、练习
讲到这里,我们来看一道面试题:
请实现一个类,计算程序中创建出了多少个类对象。
我们首先分析问题,要统计创建了多少个类对象,我们就要看类对象的统一特性,我们知道所有创建出来的对象都要经过构造函数(拷贝构造也是构造函数的重载),所以我们只需要定义一个静态成员的统计变量(注意特性1:静态成员为所有类对象所共享,不属于某个具体的对象),每次创建了对象我们就让这个静态统计变量加一就好了!
实例代码:
#include<iostream>
using std::cout;
using std::endl;
class A
{
public:A():_a(10){_count++;}A(const A& tmp){_a = tmp._a;_count++;}
private:static int _count;int _a;
};
int A::_count = 0;
int main()
{A aa1;A aa2;A aa3(aa1);A aa4(aa2);return 0;
}

我们再来思考两个问题:
- 静态成员函数可以调用非静态成员函数吗?
答案是:不能!静态成员函数没有this指针,调用非静态成员函数需要传递this指针,静态成员函数无法为非静态成员函数传递this指针,因此不能调用。 - 非静态成员函数可以调用类的静态成员函数吗?
答案是:可以!非静态成员函数有this指针,调用静态成员函数不需要传递this指针,非静态成员函数可以为静态成员函数传递this指针,因此能够调用。
三、 友元
我们知道想要在类外访问类中的私有成员一般是做不到的,但是当我们想要在类外访问类中的私有成员时我们便需要一些特殊手段了,如友元
1、介绍
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
友元分为:友元函数和友元类
2、友元函数
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
#include<iostream>
using namespace std;
class Date
{friend ostream& operator<<(ostream& _cout, const Date& d);//友元函数的声明friend istream& operator>>(istream& _cin, Date& d);//友元函数的声明
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}
private:int _year;int _month;int _day;
};
//运算符重载
ostream& operator<<(ostream& _cout, const Date& d)
{_cout << d._year << "-" << d._month << "-" << d._day;//不使用友元函数,无法访问这里的成员变量。return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{_cin >> d._year; //不使用友元函数,无法访问这里的成员变量。_cin >> d._month; //不使用友元函数,无法访问这里的成员变量。_cin >> d._day; //不使用友元函数,无法访问这里的成员变量。return _cin;
}
int main()
{Date d;cin >> d;cout << d << endl;return 0;
}
a.特性
①友元函数可访问类的私有和保护成员,但不是类的成员函数
②友元函数不能用const修饰(友元函数没有this指针)
③友元函数可以在类定义的任何地方声明,不受类访问限定符限制
④一个函数可以是多个类的友元函数
⑤友元函数的调用与普通函数的调用原理相同
3、友元类
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
a.特性
- 友元关系是单向的,不具有交换性。
比如下面的Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。 - 友元关系不能传递
如果C是B的友元, B是A的友元,则不能说明C时A的友元。 - 友元关系不能继承。
//友元类
class Time
{friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成员变量
public:Time(int hour = 0, int minute = 0, int second = 0): _hour(hour), _minute(minute), _second(second){}
private:int _hour;int _minute;int _second;
};
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}void SetTimeOfDate(int hour, int minute, int second){// 直接访问时间类私有的成员变量_t._hour = hour;_t._minute = minute;_t._second = second;}
private:int _year;int _month;int _day;Time _t;
};
四、 内部类
1、定义
概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。
2、特性:
- 内部类可以定义在外部类的public、protected、private都是可以的,并且受到访问限定符的影响。
- 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
- sizeof(外部类)=外部类,和内部类没有任何关系。
实例代码
//内部类
#include<iostream>
using namespace std;
class A
{
private:static int k;int h;
public:class B // B天生就是A的友元{public:void foo(const A& a){cout << k << endl;//OKcout << a.h << endl;//OK}};
};
int A::k = 1;
int main()
{A::B b;b.foo(A());return 0;
}
五、匿名对象
1、定义
匿名对象就是指我们定义一个对象但是它没有名字(C语言里面也有匿名结构体),匿名对象的使用场景通常是:临时需要一个变量,但又不太想让它发挥很大的作用。
定义的格式: 类名()
//例如 A是一个类
A();//定义一个匿名对象
2、特性
匿名对象的生命周期只有它所在的那一行,那下一行过后它就会自动调用析构函数。
//匿名对象
#include<iostream>
using namespace std;
class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};
class Solution {
public:int Sum_Solution(int n) {//...return n;}
};
int main()
{A aa1;// 不能这么定义对象,因为编译器无法识别下面是一个函数声明,还是对象定义//A aa1();// 但是我们可以这么定义匿名对象,匿名对象的特点不用取名字,// 但是他的生命周期只有这一行,我们可以看到下一行他就会自动调用析构函数A();A aa2(2);// 匿名对象在这样场景下就很好用,如果不定义匿名对象我们就要创建一个Solution这样的对象。Solution().Sum_Solution(10);return 0;
}
六、拷贝对象时的一些编译器优化
随着编译器的发展迭代,现在的编译器已经非常智能了,一般在一些不算太老的编译器上编译器在传参和传返回值的过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还是非常有用的。
下面我们一起来看一下吧!
//拷贝对象时的一些编译器优化
#include<iostream>
using namespace std;
class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}A(const A& aa):_a(aa._a){cout << "A(const A& aa)" << endl;}A& operator=(const A& aa){cout << "A& operator=(const A& aa)" << endl;if (this != &aa){_a = aa._a;}return *this;}~A(){cout << "~A()" << endl;}private:int _a;
};void f1(A aa)
{}
A f2()
{A aa;return aa;
}
A f3()
{return A();
}int main()
{// 传值传参 不优化A aa1; f1(aa1);cout << "----------------------------------------------------" << endl;// 传值返回f2(); //不优化 调用一个构造函数+一个拷贝构造 因为是两行代码编译器不敢擅自优化cout << "----------------------------------------------------" << endl;// 隐式类型,构造+拷贝构造->优化为直接构造f1(1);// 一个表达式中,构造+连续拷贝构造->优化为一个构造f1(A(2));cout << "----------------------------------------------------" << endl;// 一个表达式中,连续拷贝构造+拷贝构造->优化一个拷贝构造A aa2 = f2();cout << "----------------------------------------------------" << endl;// 一个表达式中,连续拷贝构造+赋值重载->无法优化aa1 = f2();cout << "----------------------------------------------------" << endl;f3(); //一行中构造+拷贝构造 ->优化为一个构造A aa3 = f3(); //一行中构造+拷贝构造+拷贝构造 ->优化为一个构造return 0;
}

七、 再次理解类和对象
现实生活中的实体计算机并不认识,计算机只认识二进制格式的数据。如果想要让计算机认识现实生活中的实体,用户必须通过某种面向对象的语言,对实体进行描述,然后通过编写程序,创建对象后计算机才可以认识。比如想要让计算机认识洗衣机,就需要:
- 用户先要对现实中洗衣机实体进行抽象—即在人为思想层面对洗衣机进行认识,洗衣机有什么属性,有那些功能,即对洗衣机进行抽象认知的一个过程
- 经过1之后,在人的头脑中已经对洗衣机有了一个清醒的认识,只不过此时计算机还不清楚,想要让计算机识别人想象中的洗衣机,就需要人通过某种面相对象的语言(比如:C++、Java、Python等)将洗衣机用类来进行描述,并输入到计算机中
- 经过2之后,在计算机中就有了一个洗衣机类,但是洗衣机类只是站在计算机的角度对洗衣机对象进行描述的,通过洗衣机类,可以实例化出一个个具体的洗衣机对象,此时计算机才能洗衣机是什么东西。
- 用户就可以借助计算机中洗衣机对象,来模拟现实中的洗衣机实体了。
在类和对象阶段,大家一定要体会到,类是对某一类实体(对象)来进行描述的,描述该对象具有那些属性,那些方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化具体的对象。

相关文章:
【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化
前言 本章就是我们C中类与对象的终章了,不过本章的难度不大,都是类中一些边边角角的知识,记忆理解就行了,相信经过这么长时间的学习类与对象,你对面向对象也有了更加深的理解,最后我们学习完边边角角的一些…...
04:进阶篇 - 编译 CTK
作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在使用 CTK 之前,首先要进行编译。但要成功编译它,并不是一件很容易的事,这不仅取决于平台、Qt 的版本,也取决于编译器,以及所使用的 IDE。 平台(Linux、Windows)Qt 版本(4.x、5.x、6.x)编译器(MS…...
SQL73 返回所有价格在 3美元到 6美元之间的产品的名称和价格
描述有表Productsprod_idprod_nameprod_pricea0011egg3a0019sockets4b0019coffee15【问题】编写 SQL 语句,返回所有价格在 3美元到 6美元之间的产品的名称(prod_name)和价格(prod_price),使用 AND操作符&am…...
【Linux 多线程互斥】如何保证锁的原子性(互斥的原理)
临界资源:可以被多个执行流(线程或者叫轻量级进程)同是访问的(多个执行流共享的,比如:全局、堆等等);临界区:访问这些临界资源的代码;原子性:没有中间态&…...
Android 实现沉浸式全屏
前言 本文总结 Android 实现沉浸式全屏的实现方式。 实现沉浸式全屏 在一些需要全屏显示的场景下,比如玩游戏、看横屏视频的时候,内容全屏,占满窗口的体验会让用户更加沉浸到对内容的消费中,带来好的用户体验。 沉浸式显示具体来说就是如状态栏和导航栏部分的显示效果调…...
数据分析与SAS学习笔记6
数据集整理: 目的:对数据集中的数据进行预处理,使数据更适合统计分析过程对数据格式的要求; 常见整理要求: 1)建立新的变量,衍生变量,删除某些原变量; 2)…...
自动化完成1000个用户的登录并获取token并生成tokens.txt文件
自动化完成1000个用户的登录并获取token并生成tokens.txt文件 写作背景 在我学习使用redis实现秒杀功能的过程中,在编写完秒杀代码后,需要使用Jmeter实际测试1000个用户进行秒杀,由于秒杀功能需要在用户登录完成后才能实现,用户是…...
2023年全国最新安全员精选真题及答案1
百分百题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 11.(单选题)在起重作业中,()…...
NoMachine 输入用户名密码后 闪断 解决办法
大家好,我是虎哥,最近工作忙,好长时间没有继续套件的深度学习,今天周六,难得有空,泡好茶,打开电脑,链接套件桌面,得,出问题了,一个很奇怪的问题&a…...
WebADI - 参数的使用
* 本文仅供交流分享,不作为专业指导 最近研究了一下WEBADI文档下载的参数,由于网上这块资料较少,所以专意分享下我的笔记。 准备 集成器:BHSC_EMP_ADI 表值集:BHSC_DEPT_LOV(值:dname&#x…...
【OJ】两个圆
📚Description: 直角坐标系内现有两个半径相等的圆,问两圆的位置关系。 位置关系有:重合,相切,相离,相交; 若两圆相交,需要求出两圆的重叠面积。 ⏳Input: 输入包含多组数据&a…...
一文读懂澳洲医疗:白菜价的药物怎么领?
众所周知,福利优厚的澳洲,在医疗系统上有着令全世界人民都羡慕的超高福利。 几十万的天价药,在澳洲,白菜价就能轻松到手。 国内70万元一针的“诺西那生钠注射液”(目前中国国内唯一治疗脊髓性肌萎缩症的进口精准靶向药…...
scrum看板视图切换时间线视图做项目管理
企业需要开发一个项目,可以制作时间线进行管理,以便参与者和管理者了解项目的时间进度。项目进行到哪一步,参与者有哪些,责任人是谁,这些都可以通过时间线进行展示。「时间线视图」是一种比甘特图更轻量、更实用的工具…...
10、MySQL查询优化
MySQL查询优化 1.MySQL查询优化技术2.子查询优化2.1 优化器自动优化2.2 优化措施:子查询合并2.2 优化措施:子查询上拉技术3.外连接消除4.生产环境不使用join联表查询5.group by分组优化5.1 group by执行流程5.2 为什么group by要创建临时表6.order by排序优化7.MySQL性能抖动…...
C++模板(一)
文章目录C模板(一)1. 泛型编程2. 函数模板2.1 函数模板格式2.2 模板原理2.3 模板实例化2.4 模板参数匹配原则3. 类模板3.1 类模板格式3.2 背景3.3 类模板的实例化C模板(一) 1. 泛型编程 前面我们学到了函数重载这个特性…...
【TypeScript】TypeScript的基础类型(string,number,boolean,void,null,undefined):
文章目录一、安装【1】安装npm install typescript -g【2】基础类型:Boolean、Number、String、null、undefined 以及 ES6 的 Symbol 和 ES10 的 BigInt二、字符串类型(string)三、数字类型(number)四、布尔类型(boolean)五、空值类型(void)六、null和undefined类型…...
【C语言】 详谈指针
☃️内容专栏:【C语言】初阶部分 ☃️本文概括:继初识C语言,对C语言指针初阶部分进行归纳与总结。 ☃️本文作者:花香碟自来_ ☃️发布时间:2023.2.17 目录 一、指针和指针类型 1.1 指针 1.2 指针类型 其一&#x…...
内网渗透(三十八)之横向移动篇-pass the key 密钥传递攻击(PTK)横向攻击
系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…...
教你快速学会画动漫人物表情
动漫人物表情画法,3分钟教你快速学会画表情,快来跟我一起零成本学板绘吧!咱们的免费板绘系列教程又来啦,今天教大家的板绘技能是什么呢?今天的板绘学习教程来教你如何画动漫女生的表情! 板绘动漫女生的表情…...
Qt系列:调用Edge浏览器示例
背景 需要解决以下几个问题 政府项目新浏览器兼容老系统ActiveX控件,Qt WebEngineView没有直接的实现方案,需要利用Qt的ActiveX兼容模块与浏览器往返多次交互Qt ActiveX未实现COM事件通知官方Win32示例存在滥用lambda函数的嫌疑,lambda函数…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
