C++面试答案整理

内容转自:http://www.dev26.com/blog/article/442

1.new 、 delete 、 malloc 、 free 关系

delete 会调用对象的析构函数 , 和 new 对应 free 只会释放内存, new 调用构造函数。 malloc 与 free 是 C++/C 语言的标准库函数, new/delete 是 C++ 的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free 。因此 C++ 语言需要一个能完成动态内存分配和初始化工作的运算符 new ,以及一个能完成清理与释放内存工作的运算符 delete 。注意 new/delete 不是库函数。

总结:new和delete会自动调用对象的构造与析构函数而malloc与free不会;

new和delete式C++运算符,而malloc和free是C/C++标准库函数。
——————————————————————————————–
2.delete 与 delete [] 区别

delete 只会调用一次析构函数,而 delete[] 会调用每一个成员的析构函数。在 More Effective C++ 中有更为详细的解释:“当 delete 操作符用于数组时,它为每个数组元素调用析构函数,然后调用 operatordelete 来释放内存。” delete 与 New 配套, delete [] 与 new [] 配套

MemTest*mTest1=newMemTest[10];

MemTest*mTest2=newMemTest;

int*pInt1=newint[10];

int*pInt2=newint;

delete[]pInt1; //-1-

delete[]pInt2; //-2-

delete[]mTest1;//-3-

delete[]mTest2;//-4-

在 -4- 处报错。

这就说明:对于内建简单数据类型, delete 和 delete[] 功能是相同的。对于自定义的复杂数据类型, delete 和 delete[] 不能互用。 delete[] 删除一个数组, delete 删除一个指针简单来说,用 new 分配的内存用 delete 删除用 new[] 分配的内存用 delete[] 删除 delete[] 会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用 delete 时没用括号, delete 就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。

总结: delete 只会调用一次析构函数,而 delete[] 会调用每一个成员的析构函数。
——————————————————————————————–
3.C C++ JAVA 共同点,不同之处?

相同点:都是面向对象的语言
不同点:c/c++是编译型语言,还有一些语言完全是解释型的(如Basie),而java既是编译型的又是解释型的语言
c/c++存在指针运算,Basie没有显示指针,而java有指针,但取消了指针的运算
——————————————————————————————–
4. 继承优缺点。

类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变父类的实现。但是类继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。更糟的是,父类通常至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为。如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。
——————————————————————————————–
5.C++ 有哪些性质(面向对象特点)
封装,继承和多态。

在面向对象程序设计语言中,封装是利用可重用成分构造软件系统的特性,它不仅支持系统的可重用性,而且还有利于提高系统的可扩充性;消息传递可以实现发送一个通用的消息而调用不同的方法;封装是实现信息隐蔽的一种技术,其目的是使类的定义和实现分离。
——————————————————————————————–
6. 子类析构时要调用父类的析构函数吗?
析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候 , 派生类的信息已经全部销毁了定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数 JAVA 无析构函数深拷贝和浅拷贝
——————————————————————————————–
7. 多态,虚函数,纯虚函数

这么一大堆名词,实际上就围绕一件事展开,就是多态,其他三个名词都是为实现C++的多态机制而提出的一些规则,下面分两部分介绍,第一部分介绍【多态】,第二部分介绍【虚函数,纯虚函数,抽象类】
一 【多态】
多态的概念 :关于多态,好几种说法,好的坏的都有,分别说一下:
1 指同一个函数的多种形态。
个人认为这是一种高手中的高手喜欢的说法,对于一般开发人员是一种差的不能再差的概念,简直是对人的误导,然人很容易就靠到函数重载上了。

以下是个人认为解释的比较好的两种说法,意思大体相同:
2多态是具有表现多种形态的能力的特征,在OO中是指,语言具有根据对象的类型以不同方式处理之,特别是重载方法和继承类这种形式的能力。
这种说法有点绕,仔细想想,这才是C++要告诉我们的。

3多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。
这种说法看来是又易懂,又全面的一种,尤其是最后一句,直接点出了虚函数与多态性的关系,如果你还是不太懂,没关系,再把3读两遍,有个印象,往后看吧。
- – - – - – - – - – - – - – - – - – - – - – - – - – - – - – -
二 【虚函数,纯虚函数,抽象类】
多态才说了个概念,有什么用还没说就进入第二部分了?看看概念3的最后一句,虚函数就是为多态而生的,多态的作用的介绍和虚函数简直关系太大了,就放一起说吧。

多态的作用:继承是子类使用父类的方法,而多态则是父类使用子类的方法。这是一句大白话,多态从用法上就是要用父类(确切的说是父类的对象名)去调用子类的方法,例如:
【例一】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class  A {
public :
A() {}
( virtual )  void  print() {
cout << “This is A.” << endl;
}
};
class  B :  public  A {
public :
B() {}
void  print() {
cout << “This is B.” << endl;   }   };    int  main( int  argc,  char * argv[]) {    B b; A a; a = b;a.print;—————————————- make1  // A &a = b; a->print();———————————-make2
//A *a = new B();a->print();——————————–make3
return  0;
}


这将显示:
This is B.
如果把virtual去掉,将显示:
This is A.
(make1,2,3分别是对应兼容规则(后面介绍)的三种方式,调用结果是一样的)
加上virtual ,多态了,B中的print被调用了,也就是可以实现父类使用子类的方法。
对多态的作用有一个初步的认识了之后,再提出更官方,也是更准确的对多态作用的描述:
多态性使得能够利用同一类(基类)类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作。把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(也就是可以调用子对象中对父对象的相关函数的改进方法)。

那么上面例子中为什么去掉virtual就调用的不是B中的方法了呢,明明把B的对象赋给指针a了啊,是因为C++定义了一组对象赋值的兼容规则,就是指在公有派生的情况下,对于某些场合,一个派生类的对象可以作为基类对象来使用,具体来说,就是下面三种情形:

Class A ;
class B:public A

1. 派生的对象可以赋给基类的对象
A a;
B b;
a = b;
2. 派生的对象可以初始化基类的引用
B b;
A &a = b;
3. 派生的对象的地址可以赋给指向基类的指针
B b;
A *a = &b;
或
A *a = new B();
由上述对象赋值兼容规则可知,一个基类的对象可兼容派生类的对象,一个基类的指针可指向派生类的对象,一个基类的引用可引用派生类的对象,于是对于通过基类的对象指针(或引用)对成员函数的调用,编译时无法确定对象的类,而只是在运行时才能确定并由此确定调用哪个类中的成员函数。
看看刚才的例子,根据兼容规则,B的对象根本就被当成了A的对象来使用,难怪B的方法不能被调用。
【例二】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include
using  namespace  std;
class  A
{
public :
void  ( virtual ) print(){cout << “A print”<
private :
};
class  B :  public  A
{
public :
void  print(){cout << “B print”<  private :
};
void  test(A &tmpClass)
{
tmpClass.print();
}
int  main( void )
{
B b;
test(b);
getchar ();
return  0;
}

 

这将显示:
B print
如果把virtual去掉,将显示:
A print
那么,为什么加了一个virtual以后就达到调用的目的了呢,多态了嘛~那么为什么加上virtual就多态了呢,我们还要介绍一个概念:联编
函数的联编:在编译或运行将函数调用与相应的函数体连接在一起的过程。
1 先期联编或静态联编:在编译时就能进行函数联编称为先期联编或静态联编。
2 迟后联编或动态联编:在运行时才能进行的联编称为迟后联编或动态联编。
那么联编与虚函数有什么关系呢,当然,造成上面例子中的矛盾的原因就是代码的联编过程采用了先期联编,使得编译时系统无法确定究竟应该调用基类中的函数还是应该调用派生类中的函数,要是能够采用上面说的迟后联编就好了,可以在运行时再判断到底是哪个对象,所以,virtual关键字的作用就是提示编译器进行迟后联编,告诉连接过程:“我是个虚的,先不要连接我,等运行时再说吧”。
那么为什么连接的时候就知道到底是哪个对象了呢,这就引出虚函数的原理了:当编译器遇到virtual后,会为所在的类构造一个表和一个指针,那个表叫做vtbl,每个类都有自己的vtbl,vtbl的作用就是保存自己类中虚函数的地址,我们可以把vtbl形象地看成一个数组,这个数组的每个元素存放的就是虚函数的地址.指针叫做vptr,指向那个表。而这个指针保存在相应的对象当中,也就是说只有创建了对象以后才能找到相应虚函数的地址。
【注意】
1为确保运行时的多态定义的基类与派生类的虚函数不仅函数名要相同,其返回值及参数都必须相同,否则即使加上了virtual,系统也不进行迟后联编。
2 虚函数关系通过继承关系自动传递给基类中同名的函数,也就是上例中如果A中print有virtual,那么 B中的print即使不加virtual,也被自动认为是虚函数。
*3 没有继承关系,多态机制没有意义,继承必须是公有继承。
*4现实中,远不只我举的这两个例子,但是大的原则都是我前面说到的“如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的”。这句话也可以反过来说:“如果你发现基类提供了虚函数,那么你最好override它”。

纯虚函数:
虚函数的作用是为了实现对基类与派生类中的虚函数成员的迟后联编,而纯虚函数是表明不具体实现的虚函数成员,即纯虚函数无实现代码。其作用仅仅是为其派生类提过一个统一的构架,具体实现在派生类中给出。
一个函数声明为纯虚后,纯虚函数的意思是:我是一个抽象类!不要把我实例化!纯虚函数用来规范派生类的行为,实际上就是所谓的“接口”。它告诉使用者,我的派生类都会有这个函数。
抽象类:
含有一个或多个纯虚函数的类称为抽象类。
【例三】
#include

using namespace std;
class A
{
public:
virtual float print() = 0;
protected:
float h,w;
private:
};
class B : public A
{
public:
B(float h0,float w0){h = h0;w = w0;}
float print(){return h*w;}
private:
};
class C : public A
{
public:
C(float h0,float w0){h = h0;w = w0;}
float print(){return h*w/2;}
private:
};

int main(void)
{
A *a1,*a2;
B b(1,2);
C c(1,2);
a1 = &b;
a2 = &c;
cout << a1->print()<print()<print;a2->print就不能用了),给多态性造成不便,这里要强调的是,我们是希望用基类的指针调用派生类的方法,希望用到多态机制,如果读者并不想用基类指针,认为用b,c指针直接调用更好,那纯虚函数就没有意义了,多态也就没有意义了,了解一下多态的好处,再决定是否用纯虚函数吧。
【注意】
1 抽象类并不能直接定义对象,只可以如上例那样声明指针,用来指向基类派生的子类的对象,上例中的A *a1,*a2;该为 A a1,a2;是错误的。
2 从一个抽象类派生的类必须提供纯虚函数的代码实现或依旧指明其为派生类,否则是错误的。
3 当一个类打算被用作其它类的基类时,它的析构函数必须是虚的。
【例三】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class  A
{
public :
A() { ptra_ =  new  char [10];}
~A() {  delete [] ptra_;}  // 非虚析构函数
private :
char  * ptra_;
};
class  B:  public  A
{
public :
B() { ptrb_ =  new  char [20];}
~B() {  delete [] ptrb_;}
private :
char  * ptrb_;
};
void  foo()
{
A * a =  new  B;
delete  a;
}

 

在这个例子中,程序也许不会象你想象的那样运行,在执行delete a的时候,实际上只有A::~A()被调用了,而B类的析构函数并没有被调用!这是否有点儿可怕? 如果将上面A::~A()改为virtual,就可以保证B::~B()也在delete a的时候被调用了。因此基类的析构函数都必须是virtual的。纯虚的析构函数并没有什么作用,是虚的就够了。通常只有在希望将一个类变成抽象类(不能实例化的类),而这个类又没有合适的函数可以被纯虚化的时候,可以使用纯虚的析构函数来达到目的。

最后通过一个例子说明一下抽象类,纯虚函数以及多态的妙用吧:
我们希望通过一个方法得到不同图形面积的和的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include
using  namespace  std;
class  A  //定义一个抽象类,用来求图形面积
{
public :
virtual  float  area() = 0; //定义一个计算面积的纯虚函数,图形没确定,当
//不能确定具体实现
protected :
float  h,w;  //这里假设所有图形的面积都可以用h和w两个元素计算得出
//就假设为高和长吧
private :
};
class  B :  public  A  //定义一个求长方形面积的类
{
public :
B( float  h0, float  w0){h = h0;w = w0;}
float  area (){ return  h*w;} //基类纯虚函数的具体实现
private :
};
class  C :  public  A  //定义一个求三角形面积的类
{
public :
C( float  h0, float  w0){h = h0;w = w0;}
float  area (){ return  h*w/2;} //基类纯虚函数的具体实现
private :
};
float  getTotal(A *s[], int  n) //通过一个数组传递所有的图形对象
//多态的好处出来了吧,不是多态,不能用基类A调用
//参数类型怎么写,要是有100个不同的图形,怎么传递
{
float  sum = 0;
for ( int  i = 0;i < n; i++) sum = sum + s[i]->area();
return  sum;
}
int  main( void )
{
float  totalArea;
A *a[2];
a[0] =  new  B(1,2);  //一个长方形对象
a[1] =  new  C(1,2); //一个三角形对象
totalArea = getTotal(a , 2); //求出两个对象的面积和
getchar ();
return  0;
}

 

——————————————————————————————–

8. 求下面函数的返回值(微软)

1
2
3
4
5
6
7
8
9
10
int  func(x)
{
int  countx = 0;
while (x)
{
countx ++;
x = x&(x-1);
}
return  countx;
}

 

假定 x = 9999 。 答案: 8

思路:将 x 转化为 2 进制,看含有的 1 的个数。
——————————————————————————————–
9. 什么是 “ 引用 ” ?申明和使用 “ 引用 ” 要注意哪些问题?
答:引用就是某个目标变量的 “ 别名 ”(alias) ,对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。
——————————————————————————————–
10. 将 “ 引用 ” 作为函数参数有哪些特点?
( 1 )传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。

( 2 )使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

( 3 )使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用 “* 指针变量名 ” 的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。
——————————————————————————————–
11. 在什么时候需要使用 “ 常引用 ” ?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式: const 类型标识符 & 引用名 = 目标变量名;

例 1

int a ;
const int &ra=a;
ra=1; // 错误
a=1; // 正确

例 2

string foo( );
void bar(string & s);

那么下面的表达式将是非法的:

bar(foo( ));
bar(“hello world”);

原因在于 foo( ) 和 “hello world” 串都会产生一个临时对象,而在 C++ 中,这些临时对象都是 const 类型的。因此上面的表达式就是试图将一个 const 类型的对象转换为非 const 类型,这是非法的。引用型参数应该在能被定义为 const 的情况下,尽量定义为 const 。
——————————————————————————————–
12. 将 “ 引用 ” 作为函数返回值类型的格式、好处和需要遵守的规则 ?
格式:类型标识符 & 函数名(形参列表及类型说明) { // 函数体 }

好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生 runtime error! 注意事项:

( 1 )不能返回局部变量的引用。这条可以参照 Effective C++[1] 的 Item 31 。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了 ” 无所指 ” 的引用,程序会进入未知状态。

( 2 )不能返回函数内部 new 分配的内存的引用。这条可以参照 Effective C++[1] 的 Item 31 。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部 new 分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由 new 分配)就无法释放,造成 memory leak 。

( 3 )可以返回类成员的引用,但最好是 const 。这条原则可以参照 Effective C++[1] 的 Item 30 。主要原因是当对象的属性是与某种业务规则( business rule )相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。

( 4 )流操作符重载返回值申明为 “ 引用 ” 的作用:

流操作符 << 和 >> ,这两个操作符常常希望被连续使用,例如: cout << “hello” << endl;  因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个 << 操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用 << 操作符。因此,返回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是 C++ 语言中引入引用这个概念的原因吧。 赋值操作符 = 。这个操作符象流操作符一样,是可以连续使用的,例如: x = j = 10; 或者 (x=10)=100; 赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。

例 3

# i nclude
int &put(int n);
int vals[10];
int error=-1;
void main()
{
put(0)=10; // 以 put(0) 函数值作为左值,等价于 vals[0]=10;
put(9)=20; // 以 put(9) 函数值作为左值,等价于 vals[9]=20;
cout< cout<=0 && n else { cout< 6″) : puts(” return 0;
}
——————————————————————————————–
114. 交换两个数的宏定义

交换两个参数值的 宏定义 为: . #define SWAP (a,b) (a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b);
——————————————————————————————–
115.Itearator 各指针的区别

游标和指针

我说过游标是指针,但不仅仅是指针。游标和指针很像,功能很像指针,但是实际上,游标是通过重载一元的 ”*” 和 ”->” 来从容器中间接地返回一个值。将这些值存储在容器中并不是一个好主意,因为每当一个新值添加到容器中或者有一个值从容器中删除,这些值就会失效。在某种程度上,游标可以看作是句柄( handle )。通常情况下游标( iterator )的类型可以有所变化,这样容器也会有几种不同方式的转变:

iterator—— 对于除了 vector 以外的其他任何容器,你可以通过这种游标在一次操作中在容器中朝向前的方向走一步。这意味着对于这种游标你只能使用 “++” 操作符。而不能使用 “–” 或 “+=” 操作符。而对于 vector 这一种容器,你可以使用 “+=” 、 “—” 、 “++” 、 “-=” 中的任何一种操作符和 “” 、 “>=” 、 “==” 、 “!=” 等比较运算符。
——————————————————————————————–
116. C++ 中的 class 和 struct 的区别
从语法上,在 C++ 中(只讨论 C++ 中)。 class 和 struct 做类型定义时只有两点区别:
(一)默认继承权限。如果不明确指定,来自 class 的继承按照 private 继承处理,来自 struct 的继承按照 public 继承处理;
(二)成员的默认访问权限。 class 的成员默认是 private 权限, struct 默认是 public 权限。
除了这两点, class 和 struct 基本就是一个东西。语法上没有任何其它区别。

不能因为学过 C 就总觉得连 C++ 中 struct 和 class 都区别很大,下面列举的说明可能比较无聊,因为 struct 和 class 本来就是基本一样的东西,无需多说。但这些说明可能有助于澄清一些常见的关于 struct 和 class 的错误认识:
( 1 )都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
( 2 )都可以有一大堆 public/private/protected 修饰符在里边;
( 3 )虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:

A a = {1, 2, 3}; 不管 A 是个 struct 还是个 class ,前提是这个类 / 结构足够简单,比如所有的成员都是 public 的,所有的成员都是简单类型,没有显式声明的构造函数。
( 4 )都可以进行复杂的继承甚至多重继承,一个 struct 可以继承自一个 class ,反之亦可;一个 struct 可以同时继承 5 个 class 和 5 个 struct ,虽然这样做不太好。
( 5 )如果说 class 的设计需要注意 OO 的原则和风格,那么没任何理由说设计 struct 就不需要注意。
( 6 )再次说明,以上所有说法都是指在 C++ 语言中,至于在 C 里的情况, C 里是根本没有 “class” ,而 C 的 struct 从根本上也只是个包装数据的语法机制。
—————————————————————

最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点: “class” 这个关键字还用于定义模板参数,就像 “typename” 。但关键字 “struct” 不用于定义模板参数。

在模版中,类型参数前面可以使用class或typename,如果使用struct,则含义不同,struct后面跟的是“non-type template parameter”,而class或typename后面跟的是类型参数。
template
void f(X x)
{
}
//出错信息:d:codecpptestcpptestcpptest.cpp(33) : error C2065: ‘X’ : undeclared identifier

关于使用大括号初始化

class 和 struct 如果定义了构造函数的话,都不能用大括号进行初始化

如果没有定义构造函数, struct 可以用大括号初始化。

如果没有定义构造函数,且所有成员变量全是 public 的话,可以用大括号初始化。

关于默认访问权限

class 中默认的成员访问权限是 private 的,而 struct 中则是 public 的。

关于继承方式

class 继承默认是 private 继承,而 struct 继承默认是 public 继承。

关于模版

在模版中,类型参数前面可以使用 class 或 typename ,如果使用 struct ,则含义不同, struct 后面跟的是 “non-type template parameter” ,而 class 或 typename 后面跟的是类型参数。

class 中有个默认的 this 指针, struct 没有
不同点:构造函数,析构函数 this 指针
——————————————————————————————–
117. 有关重载函数

返回值类型不同构不成重载
参数参数顺序不同能构成重载

c++ 函数同名不同返回值不算重载!函数重载是忽略返回值类型的。

成员函数被重载的特征有:
1) 相同的范围(在同一个类中);
2) 函数名字相同;
3) 参数不同;
4) virtual 关键字可有可无。

5) 成员函数中 有无 const ( 函数后面 ) 也可判断是否重载
——————————————————————————————–
118. 数据库与 T-SQL 语言

关系数据库是表的集合,它是由一个或多个关系模式定义。 SQL 语言中的数据定义功能包括对数据库、基本表、视图、索引的定义。
——————————————————————————————–
119. 关系模型的基本概念

关系数据库以关系模型为基础,它有以下三部分组成:
● 数据结构 —— 模型所操作的对象、类型的集合
● 完整性规则 —— 保证数据有效、正确的约束条件
● 数据操作 —— 对模型对象所允许执行的操作方式
关系( Relation )是一个由行和列组成的二维表格,表中的每一行是一条记录( Record ),每一列是记录的一个字段( Field )。表中的每一条记录必须是互斥的,字段的值必须具有原子性。

——————————————————————————————–
120.SQL 语言概述

SQL (结构化查询语言)是关系数据库语言的一种国际标准,它是一种非过程化的语言。通过编写 SQL ,我们可以实现对关系数据库的全部操作。
● 数据定义语言( DDL ) —— 建立和管理数据库对象
● 数据操纵语言( DML ) —— 用来查询与更新数据
● 数据控制语言( DCL ) —— 控制数据的安全性

起来是一个很简单的问题,每一个使用过 RDBMS 的人都会有一个概念。

事务处理系统的典型特点是具备 ACID 特征。 ACID 指的是 Atomic (原子的)、 Consistent (一致的)、 Isolated (隔离的)以及 Durable (持续的),它们代表着事务处理应该具备的四个特征:

原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分

一致性:在事务处理执行之前和之后,数据是一致的。

隔离性:一个事务处理对另一个事务处理没有影响。

持续性:当事务处理成功执行到结束的时候,其效果在数据库中被永久纪录下来。
——————————————————————————————–
121.C 语言中结构化程序设计的三种基本控制结构

顺序结构
选择结构
循环结构
——————————————————————————————–
122.CVS 是什么

cvs ( Concurrent Version System ) 是一个版本控制系统。使用它,可以记录下你的源文件的历史。

例如,修改软件时可能会不知不觉混进一些 bug ,而且可能过了很久你才会察觉到它们的存在。有了 cvs ,你可以很容易地恢复旧版本,并从中看出到底是哪个修改导致了这个 bug 。有时这是很有用的。

CVS 服务器端对每个文件维护着一个修订号 , 每次对文件的更新,都会使得文件的修订号加 1 。在客户端中也对每个文件维护着一个修订号 ,CVS 通过这两个修订号的关系,来进行 Update,Commit 和发现冲突等操作操作
——————————————————————————————–
123. 三种基本的数据模型

按照数据结构类型的不同,将数据模型划分为层次模型、网状模型和关系模型。
——————————————————————————————–

面试专区|【30道C++ 基础高频题整理(附答案背诵版)】 在C++中,变量的声明和定义是两个不同的概念。声明是告诉编译器某个变量的存在,以及它的类型。声明并不分配存储空间。例如,外部变量的声明extern int a;,这里只是告诉编译器有一个类型为int的变量a存在,具体的a在哪里定义的,编译器此时并不知道。定义是声明的延伸,除了声明变量的存在和类型以外,还分配了存储空间。例如,int a;就是一个定义,编译器在这里为a分配了足够的存储空间来存储一个整数。在C++中,一个变量可以被声明多次,但只能被定义一次。 阅读详情

相关推荐

面试专区|【30道C++11高频题整理(附答案背诵版)】

在C++11中,引入了用户定义字面量(user-defined literals)的概念,允许程序员为字面量定义自己的后缀,从而创建自定义类型的字面量。这提供了一种更直观、更易于阅读的方式来表示特定类型的值。基本语法// 返回类型 operator"" 后缀名(参数类型 参数名)// 例如,定义一个用于表示长度的字面量后缀 _m// 返回以米为单位的长度在上面的示例中,是一个用户定义的字面量操作符,它允许使用_m后缀来表示长度。例如,10.5_m表示10.5米。用途增强可读性。

尺小闹的博客 2377

2020.03.19 A题解

题意:输入四个数,分别是去BugDonalds的,去BeaverKing的,都去的,总人数。求有几个人都不存在于这些情况中。 题解: 先找出矛盾的情况(前三者任何一方大于总数),再根据缺席人为总数减去分别去前两者总数。 #include <bits/stdc++.h> using namespace std; inline int read(){ int x=0,w=1; char...

Legend_666的博客 1781

面试专区 |【28道C++ 面向对象高频题整理(附答案背诵版)】

在C++中,类是一种用户定义的数据类型,它可以包含数据成员和函数成员。数据成员用于存储与类相关的状态,而函数成员可以定义对这些数据进行操作的方法。可以把类想象为一个蓝图,根据这个蓝图可以创建对象,这些对象在内存中是类的实例。比如说,我们可以定义一个Car类来表示汽车。这个类可以有数据成员如brandcolor和maxSpeed来存储汽车的品牌、颜色和最高速度等属性。同时,Car类可能有函数成员如和brake()来定义汽车加速和刹车的操作。

尺小闹的博客 1289

11.3练习

1减肥の贵妃 2成绩获取 3game star

TanTyHau的博客 1309

汽车底盘技术解析:从悬架调校到智能化,如何评价国产车底盘实力

汽车底盘作为决定车辆驾驶质感、安全性和耐久性的核心系统,其技术内涵远不止于悬架结构。从行驶系、转向系到制动系的协同工作,底盘调校是一门融合机械原理与工程实践的艺术。在电动化与智能化浪潮下,底盘技术正经历从被动适应到主动响应的变革,CDC可变阻尼减震器和空气悬架等技术的应用,让底盘具备了通过OTA升级实现性能优化的可能。国产汽车品牌如奇瑞、吉利等,通过平台化架构研发与调校经验积累,正推动底盘技术从“能用”向“好用”乃至“塑造独特驾驶风格”迈进。理解底盘技术,需超越简单的结构对比,关注其在实际路况中的滤震性、支

weixin_34413103的博客 385

手把手教你用树莓派蓝牙抓取小米温湿度计2代数据,接入HomeAssistant(附密钥获取避坑指南)

本文详细介绍了如何通过树莓派蓝牙抓取小米温湿度计2代数据并接入HomeAssistant的完整流程。重点解析了获取32位加密密钥的三种方法,包括使用Telink Flasher工具、米家APP抓包和开源工具ATC_MiThermometer,并提供了HomeAssistant集成配置和常见问题排查指南,帮助用户实现稳定可靠的温湿度监测。

一名菜鸟攻城师 779

变异知识点

float和long类型的数据要在数值后面+F/f +L/l &&(逻辑与)和&(短路与)的区别 &&:可能不会判断所有条件 &:一定会判断所有条件 不使用第三方变量,完成对两个整数变量的值进行互换 使用异或,同一变量跟另一变量异或两次等于自己本身 使用加减 //异或 a = a^b; b = a^b; a = a^b; //加减 a = a+b; b = a-b; a = a-b; 字符串连接的几种方法 +号连接 concat()连接 St.

qq_43762089的博客 2140

dify工作流的原理

摘要: Dify 工作流是一个基于有向无环图(DAG)的智能任务编排系统,支持多节点(如LLM调用、API工具、条件分支等)的可视化拖拽与流程编排。其核心原理包括执行引擎(解析DAG并管理节点依赖)、上下文变量传递(类Jinja模板的变量引用机制)和状态持久化(存储执行日志与中间结果)。工作流通过事件驱动执行,支持异步任务调度,并与RAG知识库、LLM服务等模块深度集成,最终可发布为API或对话应用。技术栈基于Python(FastAPI+Celery)和PostgreSQL,实现低代码化的AI应用开发。

nbspzs的专栏 2186

C++学习——笔试题1

C++面试过程中遇到的习题,整理一下。今年好难哦

OZ__96的博客 764

JS+H5打字练习器

实现功能 1.导入.TXT文件到打字练习内容(部分浏览器可能出于安全问题限制了这一步操作) 2.输入文本到打字练习内(弹出输入框,将要练习的内容输入至输入框) 3. 开始练习,并根据正误在打字练习内容文本上修改颜色(某个字正确显示绿色,某个字错误,显示红色,某个字没有打显示灰色) 4.开始练习、结束练习,全部输入完成后自动结束练习,也可提前手动结束练习,结束练习后弹窗用显示时和正确率。(区别在于一个全部输入完成且全部正确,一个提前结束无其他条件) 效果图 分析 HTML 结构解析 根元素:<!DO

w11111xxxl的博客 1413

UNet改进(47):Deformable Convolution在UNet中的集成与应用

本文提出了一种可变形U-Net(DeformableUNet)结构,通过在U-Net的双卷积模块中集成可变形卷积(DeformConv2d)来提升模型对物体形变和复杂结构的建模能力。传统卷积受限于固定感受野,而可变形卷积通过动态调整采样位置,能更好地适应不规则形状。实现中,在DoubleConv模块的第二个卷积层替换为可变形卷积,同时保持第一层为标准卷积以确保稳定性。实验表明,该方法在保持参数量基本不变的情况下,显著提升了分割精度(mIoU从0.712提升到0.743)。

2501_91516851的博客 201

【面试宝典】60道C++STL高频题整理(附答案背诵版)

迭代器是 C++ 标准模板库(STL)中的一个重要概念。简单来说,迭代器就像是一个指针,用于访问和遍历容器中的元素(比如数组、链表、集合等)。迭代器提供了一种统一的方法来访问容器中的元素,而不需要关心容器的具体类型。遍历容器: 通过迭代器可以遍历容器中的所有元素。例如,使用begin()和end()方法获取容器的起始和结束迭代器,然后通过循环来访问每个元素。访问元素: 可以通过迭代器读取或修改容器中的元素。连接算法与容器: STL 中的很多算法(如排序、查找等)都是通过迭代器来操作容器的。

tyler的博客 7632

lammps教程:聚合物压缩,避免“bond atoms missing”

如果使用ms建模,聚合物的链会伸出到盒子外面,在导出data文件后,盒子外面的原子被周期性算法折叠进盒子对面,这就造成了边界附近的bond原子可能被分布到了盒子的两侧。并且,这个data文件不能使用npt系综进行压缩,npt系综必须使用周期性边界,在压缩时,bond原子同样会移动到对面的边界。所以,最好的解决办法是使用一个反射墙墙进行压缩,设置一个反射墙墙既可以实现压缩效果,也可以组织原子跨越box边界移动到对面。解决这个问题的原则只有一个:导出data时确保所有的bond原子没有跨越边界。

lammps_jiayou的博客 3819

【面试宝典】30道C++11高频题库整理(附答案背诵版)

在C++11中,引入了用户定义字面量(user-defined literals)的概念,允许程序员为字面量定义自己的后缀,从而创建自定义类型的字面量。这提供了一种更直观、更易于阅读的方式来表示特定类型的值。基本语法// 返回类型 operator"" 后缀名(参数类型 参数名)// 例如,定义一个用于表示长度的字面量后缀 _m// 返回以米为单位的长度在上面的示例中,是一个用户定义的字面量操作符,它允许使用_m后缀来表示长度。例如,10.5_m表示10.5米。用途增强可读性。

tyler的博客 7401

单片机:实现FFT快速傅里叶变换算法(附完整源码)

单片机:实现FFT快速傅里叶变换算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1099

Android UI 组件系列(二):Button 进阶用法

在这篇博客中,我们深入探讨了 Button 的进阶用法,重点介绍了如何通过 事件处理 来响应用户的操作,如何使用 自定义样式 来提升按钮的外观,并利用 StateListDrawable 来管理按钮在不同状态下的表现。这些技巧能够帮助你打造更具交互性、视觉吸引力和动态响应的按钮,提升用户体验。

weixin_39339407的博客 1625

【面试宝典】30道C++ 基础高频题库整理(附答案背诵版)

是C++的一个关键字,用于为现有的类型创建一个新的名称(别名)。,那么sizeof(arr)将返回10(因为arr是一个10个字符的数组,每个字符占用1个字节),而strlen(arr)将返回5(因为字符串"hello"的长度是5,不包括终止的空字符)。例如,如果你正在开发一个需要直接访问硬件,或者需要高性能数学计算的应用(比如游戏,图形渲染,科学计算),C++可能是一个更好的选择。通过指针和引用,你可以直接操作内存,这在很多情况下都非常有用,例如,动态内存分配,函数参数传递,数据结构(如链表和树)等等。

tyler的博客 7773

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【面试精选】30道C++ 基础高频题整理(附答案背诵版)

是C++的一个关键字,用于为现有的类型创建一个新的名称(别名)。,那么sizeof(arr)将返回10(因为arr是一个10个字符的数组,每个字符占用1个字节),而strlen(arr)将返回5(因为字符串"hello"的长度是5,不包括终止的空字符)。例如,如果你正在开发一个需要直接访问硬件,或者需要高性能数学计算的应用(比如游戏,图形渲染,科学计算),C++可能是一个更好的选择。通过指针和引用,你可以直接操作内存,这在很多情况下都非常有用,例如,动态内存分配,函数参数传递,数据结构(如链表和树)等等。

tyler的博客 1335

深度学习工具包 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")

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【面试精选】60道C++STL高频题整理(附答案背诵版)

迭代器是 C++ 标准模板库(STL)中的一个重要概念。简单来说,迭代器就像是一个指针,用于访问和遍历容器中的元素(比如数组、链表、集合等)。迭代器提供了一种统一的方法来访问容器中的元素,而不需要关心容器的具体类型。遍历容器: 通过迭代器可以遍历容器中的所有元素。例如,使用begin()和end()方法获取容器的起始和结束迭代器,然后通过循环来访问每个元素。访问元素: 可以通过迭代器读取或修改容器中的元素。连接算法与容器: STL 中的很多算法(如排序、查找等)都是通过迭代器来操作容器的。

tyler的博客 1345

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【面试精选】30道C++11高频题整理(附答案背诵版)

在C++11中,引入了用户定义字面量(user-defined literals)的概念,允许程序员为字面量定义自己的后缀,从而创建自定义类型的字面量。这提供了一种更直观、更易于阅读的方式来表示特定类型的值。基本语法// 返回类型 operator"" 后缀名(参数类型 参数名)// 例如,定义一个用于表示长度的字面量后缀 _m// 返回以米为单位的长度在上面的示例中,是一个用户定义的字面量操作符,它允许使用_m后缀来表示长度。例如,10.5_m表示10.5米。用途增强可读性。

tyler的博客 1018

99道C++编程面试八股文(答案、分析和深入提问)整理

使用数组实现队列的基本思路是维护一个循环数组来存储队列中的元素。下面是一个简单的 C++ 程序,展示如何使用数组来实现队列的基本操作,包括入队(enqueue)、出队(dequeue)以及查看队头元素(front)。在C++中,找出数组中的第二小元素可以通过多种方法实现。下面是一个简单而有效的方法:我们可以通过遍历数组两次来找到最小和第二小的元素。下面是一个简单的 C++ 程序,用于打印菱形图案。用户可以输入菱形的高度(即中间行的星号数量),程序将根据输入打印出对应的菱形。

Lonelycity_zyz的博客 1046

华为android高级面试题,华为C++开发工程师面试总结整理,面试问题你能答上几个?含答案...

前言:虽然全世界每个月都可能会出现新的语言,但从TIOBE世界编程语言排行榜的数据来看,从2009年到现在,C/C++一直都在前3甲中。不论历史的车轮如何滚滚向前,学好C/C++永远不会落后。面试官问的面试题:一面:1.先自我介绍;2.把自己简历上的项目描述一下,然后选一个你认为最主要的项目来说,以及项目遇到什么问题,用什么方法解决的;3.Nagle算法和tcp的拥塞控制。4.项目用过哪些数据库吗...

weixin_42502363的博客 297

整理一些C++面试容易被问到的问题及其答案

这是陈硕在知乎给出的几个问题(针对校招) 标准库各容器的基本操作的复杂度。标准库算法的复杂度,例如 std::sort() 的平均复杂度、最坏复杂度(答 O(N^2) 和 O(N log N) 都算对),最坏情况什么时候出现。 标准库各容器(deque 除外)的数据结构(标准党勿喷,主流 STL 实现的数据结构都差不多),以及 vector 的容量增长方式。如果回答得特别好,还可以补充问为

Lyintong的博客 3437

【面试精选】39道C++内存管理高频题整理(附答案背诵版)

内存泄漏是指在程序中已分配的内存未被正确释放,导致该部分内存在程序运行期间一直占用而无法被再次使用的现象。这会逐渐消耗系统的内存资源,可能导致程序运行缓慢甚至崩溃。在C++中,内存泄漏主要发生在使用动态内存分配时。如何避免内存泄漏1. **正确使用 `new` 和 `delete`**:- 每次使用 `new` 分配内存后,都应确保在适当的时机使用 `delete` 释放内存。对于数组,使用 `new[]` 和 `delete[]`。

tyler的博客 1469

【面试宝典】39道C++内存管理高频题库整理(附答案背诵版)

内存泄漏是指在程序中已分配的内存未被正确释放,导致该部分内存在程序运行期间一直占用而无法被再次使用的现象。这会逐渐消耗系统的内存资源,可能导致程序运行缓慢甚至崩溃。在C++中,内存泄漏主要发生在使用动态内存分配时。如何避免内存泄漏正确使用new和delete- 每次使用new分配内存后,都应确保在适当的时机使用delete释放内存。对于数组,使用new[]和delete[]。使用智能指针- C++11及之后的版本中,推荐使用智能指针(如)来自动管理内存。

tyler的博客 7032
上一篇: 再转高并发处理方案
下一篇: CSS浮动属性Float详解
wtsoftware
博客等级 码龄19年 12粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值