1. const char *p和char * constp有什么区别?
Const char *p:表示的是指针指向的内容不能修改;//(*p)++是不可以的;
char * Const p:表示的是指针指向的内容可以修改,p本身的内容(指的是地址)不可修改;//比如一开始初始化的时候p = &a;但是现在p = &b;这样是不对的
2. 有参宏有什么bug?应该怎么避免这些bug ?
(1):有参宏只是简单的替换,替换后可能会出现优先级上的错误;通过将宏的参数用括号括起来,可以修复这个bug;
(2):举个例子来说明
#define ADD(a,b) (a)+(a)+(b)
Int nNum = 0;
ADD(++nNum,nNum++);
++nNum + ++nNum +nNum++;
如宏的参数使用自增或者自减运算符时,就会出现问题;可以使用内联函数来解决此问题;
3
new和delete:用于元素的申请
new[]和delete[]用于数组的申请;
例如:
#include <stdlib.h>
#include <ostream>
#include <iostream>
using std::cout;
using std::endl;
int main()
{
int *pBuf =new int[15];
int *pNum =new int('HE');
cout << *pNum <<endl;
delete pNum;
delete[] pBuf;
system("pause");
return 0;
}
4.在c语言中,出现两次以上同名函数,就会报错;
在C++中则不会报错,,
函数名可以相同,但是参数个数、类型或者参数顺序必须不同
5.假如定义函数时给出5个形参,在传参时是否可以缺省一部分参数?如果可以,应该使用什么语法来完成?
是可以的,只不过在函数声明或者定义时,可以给形参赋予一些默认数值,这样在传参时就可以缺省,下面举个例子来说明
Void Fun (int n1,int n2,int n3=0,int n4=0,int n5=0){
}
Fun(1,2);//此时默认传的值为Fun(1,2,0,0,0)
6.有关命名空间的一些小问题
在同一个文件中,如果出现了两个同名同参的函数,怎么在不修改函数名和原型的前提下解决这个错误?
简单举个例子:
head.h
void fun(){}
main.cpp
#include "head.h"
int main()
{
fun();
fun();
}
上面显然会报错,因为main函数里面有两个一模一样的fun函数(在同一个作用域下有两个同名函数),在编译时会发生错误
head.h
void fun(){}
main.cpp
#include "head.h"
namespace MYNAMESPACE{
int fun(){}
};
//using MYNAMESPACE;有了这句话,下面的MYNAMESPACE::fun();中的MYNAMESPACE::部分就可以不用写了,不过此时在本题中会报错,因为又出现了上面的错误
int main()
{
fun();
MYNAMESPACE::fun();
}
7.面向对象程序设计的三大特点:封装,继承和多态
8.C++如何通过语法来实现封装性?
首先解释一下为什么需要封装,平常我们在写程序的时候,可能会遇到这样的bug ,就是说一个数据被某个函数所修改了,发生了错误,但是在这个程序里面有很多函数去修改它,这时候你不得不一个函数一个函数去排查,这样比较麻烦,有了封装性以后,可以通过设置访问权限(把数据设为私有的),这样的话,你非要想修改这个数据,只能通过成员函数;即使出现逻辑上的错误,只要查看修改此成员函数即可。
三大访问控制符:
Public: 公有成员,在类的外面也可以访问
Protected:保护成员,类内可以访问,类外不能访问,(在子类中可以访问)
Private:私有成员,类内可以访问,类外不能访问,(在子类中可以访问)。
9.this 指针是指什么?
指的是一个对象的内存首地址
This指针指向正在调用的这个成员函数的对象,如果没有.this 指针,就不知道是哪个对象调用了类里面的数据
10.有关引用的一些小问题
引用的一些性质:
不占用内存空间(它的内存空间和被引用的变量大额内存是同一块内存)
必须初始化;(一般在初始化变量时,初始值会被考虑到新建的对象中;然而定义引用时,程序把引用和它的初始值捆绑在一起,而不是将初始值直接拷贝给引用。一旦初始化完成,引用和它的初始值对象一直捆绑在一起。因为无法令引用重新捆绑到另一个对象,因此引用必须初始化。)
初始化之后不能被修改