c++3

1、问vector<int>dst;
dst.resize(v.size());
dst中有没有对象?
如果只写vector<int>dst,dst中有对象吗?
答、有。没有
2、问vector<int>dst;
dst.reserve(v.size());
问dst中有没有对象?有没有内存????
答、有对象,但是没内存。
3、问for_each(v.begin(),v.end(),myPrint);其中myPrint是一个类,其中有()重载的函数,for_each的返回值是什么?
答、myPrint函数对象会被拷贝一份到for_each中,返回类型就是myPrint的返回类型。但是不是实参myPrint,因为不是引用。
4、问mem_func_ref是什么?mem_fun是什么?
答、成员函数适配器(对象)。成员函数适配器(指针)。
5、问bind2nd或bind1st使用有什么条件?
答、只能对函数对象进行适配。
类person内重载了一个()函数,person();就是函数对象。
6、问绑定适配器的作用?
答、将二元函数对象适配成一元函数对象。
7、问在STL中使用函数对象,要用什么头文件?
答、#include<functional>
8、vs中跳转到指定行快捷键?如何跳转到上一个光标处?
答、ctrl+G。
ctrl+-
9、class person
{
private:
static int count;
}
问有什么问题?
答、必须在class person{}结束处定义count;int person::count=0(变量类型 类作用域 变量值)
10、问在对list容器进行遍历时,用什么方式最好?
答、如果允许,可以通过弹出头元素的方式访问,但是最好是用迭代器进行遍历。
for (int i = 0; i < 10; i++)
{


int Department = rand() % 4 + 1;

EmpMul.insert(pair<int, Employee>(Department, Emp.front()));//向multimap中插入数据(注意map中不允许有重复的键值)
Emp.pop_front();//弹出链表始元素
}
这种方式并不好;可以改为
11、问、
multimap<int, Employee>::iterator *pos = MulEmp.find(i);
什么问题?
答、iterator本来就有指针的含义,再加*,是不合适的。
12、void ShowDepartmentWorkers(multimap<int, Employee> &groups, int depID)
{
auto pos = groups.find(depID);
int cnt = groups.count(depID);
for (int i = 0; i < cnt; ++i)
{
cout << "Name:" << pos->second.mName << " Salary:" << pos->second.mSalary << endl;
++pos;
}
}
问groups.find(depID)的含义是什么?
13、问
class Person
{
friend ostream& operator<<(ostream &os, Person &person)
{
os << "Name:" << person.mName << " Age:" << person.mAge;
return os;
}
public:
Person(string name, int age)
{
mName = name;
mAge = age;
}


bool operator<(const Person &person) const
{
return this->mAge < person.mAge;
}


public:
string mName;
int mAge;
};


//set存储自定义类型
void test04()
{
set<Person> s;
s.insert(Person("aaa", 20));
s.insert(Person("bbb", 70));
s.insert(Person("ccc", 70));
s.insert(Person("ddd", 50));


for (set<Person>::iterator it = s.begin(); it != s.end(); ++it)
{
cout << "Name:" << it->mName << " Age:" << it->mAge << endl;
}
}
问打印结果?为什么?
答、name:aaaAge:20
    name:bbbAge:70
    name:dddAge:50
因为set<Person> s;首先Person是一个类,如果Person中没有重载<或>号,set是不能将Persons排序的,现在Person中重载了按照年龄的方式进行比较大小,
所以年龄自然被选为键值,但是在set中是不允许出现两个相同的键值,但是实值可以,所以Person ccc并没有被插入,被拒绝。
14、问
for (auto &val : s)
{
cout << val << " ";
}
这种形式在哪使用?
答、Linux上-std=c++11;其中c是小写的。
15、
linux上运行报错
error: need ‘typename’ before ‘std::list<T>::iterator’ because ‘std::list<T>’ is a dependent scope
  list<T>::iterator it=mylist.begin();
  ^
  E3.cpp:13:20: error: expected ‘;’ before ‘it’
▽ list<T>::iterator it=mylist.begin();
编译报错位置是list<T>::iterator it=mylist.begin();
问要怎样修改?
答、通过在该句前加typename。
typename list<T>::iterator it=mylist.begin();
16、问怎样在堆上开辟一个stack对象?
答、stack<int>*ss=new stack<int>;
17、问find的返回类型是什么?
答、失败返回map.end();成功返回该元素的迭代器。
18、问Multimap和map有区别吗?
答、唯一区别是multimap的键值可以重复。
19、问在map和list中,对一个元素进行操作或删除,会影响其它迭代器吗?
答、不会。
20、pair第一个元素被称为什么?第二个元素被称为什么?
答、键值、实值。
21、问Map所有的元素类型是什么?
答、pair。
22、给出创建pair对组的三种方法?
答、pair<string,int>pair1(string("name"),20);
pair<string,int>pair2=make_pair("name",30);
pair<string,int>pair3=pair2;
23、问pair是什么?
答、新的类型。将一对值组合成一个值。而且这一对值可以有不同的数据类型,这两个值通过first和second关键字访问。
24、问set容器的第二个模板参数可以设置排序规则吗?默认规则是less<Kty>
答、对。
25、问在set中equal_range(keyElem)的返回值是什么?
答、返回容器中key与keyElem相等的上下限的两个迭代器。
26、二叉搜索树的排序规则是什么?
答、结点的左边结点的值小于结点,但是右结点的值比该结点的值大。
27、迭代器的本质是什么?
答、为对容器中的数据进行算法操作前的工具。例如vector中的迭代器很类似一个指针。
28、问删除和插入操作会不会改变set中其它元素的迭代器?
答、不会。
29、能不能通过set的迭代器改变set元素的值?
答、不能。
30、问在set容器中有键值和实值吗?
答、有,键值就是实值。既然是键值就不允许有相同的元素(键值只能有一个)。
31、问list容器的数据结构是什么?
答、循环的双向链表。
32、问list最重要的性质是什么?
答、插入操作和删除操作都不会造成原有list迭代器失效。在vector中却不具有这样作用,因为vector具有自增长特性。
33、问list容器提供的是什么迭代器?
答、Bidirectional iterators.
34、问哪些容器被使用得最频繁?
答、list和vector。
35、问queue有没有迭代器,元素的进出遵循什么条件?提不提供遍历?
答、没有迭代器,先进先出,不提供。
36、问stack有没有迭代器?有没有遍历?
答、没有迭代器,没有遍历。
37、问对deque排序的效率是怎样的?
答、效率低,所以要尽可能使用vector。
38、vector的迭代器像一个普通的指针,而deque的迭代器并不是?
答、对的。
39、deque的内存增加机制和vector有什么区别?
答、deque的内存是分段的,内存增加也是分段进行添加,不存在预留功能。
40、deque有没有容量的概念?
答、没有。
41、deque和vector的区别?
答、deque是双向开口,而vector是单向开口。deque在开头和结尾插入和删除都很方便,但是vector只在结尾插入和删除方便。
42、归并排序是稳定的算法吗?
答、是的。
43、vector是动态数组吗?
答、是。
44、问迭代器的种类有哪些?
答、输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器
45、问STL的容器中是如何存储数据的,是拷贝还是引用?
答、拷贝,外面存在数据,内部拷贝一个相同的数据。
46、问在map中equal函数的返回类型?
答、iterator对。
47、问lowr_bound和upper_bound的返回类型是什么?它们的取值细则是怎样的?
答、它们的返回类型都是iterator类型,lower_bound(5);表示包括5在内的以5为下界的第一个元素,upper(5)表示5元素的右边界值不包括5,。例如1,2,3,4,5,6,7;lower就是5;upper就是6;例如 1,3,5,2,4;lower还是5;upper就是2.那么1,2,3,6,7呢?
48、问map在进行比较时内部的函数传入的用来比较的数据的类型是?
答、key的类型而不是value的类型。
49、问map的迭代器是随机访问迭代器吗?
答、不是。是双向迭代器。
50、问multimap与map的区别?
答、multimap可以有相同的键值,map键值必须唯一。而且所有的键值都不能改变。
51、问迭代器的本质?
答、容器中指向数据的指针类型。
52、问set<Person>s;s.insert(Person("22",33));
s能插入数据吗?
答、不能,因为set插入数据,自动排序,但是Person中没有定义排序规则。所以必须在Person中指定排序规则。
53、问函数有类型吗?函数指针有类型吗?
答、没有,有
54、问如何指定set从大到小排序?
答、
55、问set容器中插入了重复的数,能成功吗?
答、不能插入成功。
55、问容器的分类是怎样的?
答、序列式容器和关联式容器。
56、问set容器内数据自动排序?
答、是的。
57、问set容器支持随机访问吗?
答、不会。
58、一般支持遍历的容器都有迭代器?
答、对
59、问什么是红黑树?
答、采用红黑树的方式将二叉排序树变为平衡二叉树后的树,为的是实现较高的查找性能。在set、multiset、map、multimap容器中被使用。
60、问栈能遍历吗?
答、不能。
61、问如何在qt中使用
for(int i=0;i<10;i++);这种形式?
答、在pro文件中添加,QMAKE_CFLAGS +=-std=c99
62、问在qt中WA_TranslucentBackground关键字要注意什么?
答、不要把_与选中关键字的方框搞混。
63、问这段代码有什么问题?
答、void Widget::paintEvent(QPaintEvent *)
{
          QPainter p(this);
          p.drawPixmap(0,0,QPixmap("../image/9aed3b336f65c6437bbefde48ef246f8.jpg"));


            p.drawPixmap(200,0,QBitmap("../image/9aed3b336f65c6437bbefde48ef246f8.jpg"));
                           }
           QPixmap pixmap;
           pixmap.load("../image/9aed3b336f65c6437bbefde48ef246f8.png");
           p.drawPixmap(0,200,pix);


答、}写错了位置。
64、问子类继承父类,子类中有父类的同名函数,问父类的函数对子类来说会怎样?子类不能访问隐藏的父类函数的含义是什么?
答、父类的同名函数对于子类来说全部吟唱;①、子类不能通过对象访问父类中的函数;②、在子类中也不能调用父类的函数。
65、问怎样创建匿名的容器对象?
答、vector<int>(interg);其中interg是原有的一个vector<int>对象。
66、问sort(qq.begin(),qq.end());
其中vector<Person>qq;
问怎样才能使sort运行成功,Person是一个类。
答、在Person类中重载<号运算符或>号运算符,这样sort比较的时候就会自动调用反函数。实际上sort系统定义函数的时候会比较(*(qq.begin())与(*(qq.begin()+1))
(只是个示义),由于他们都是对象,自然会调用Person类中重载的<号或大于号。
67、问常用的容器有哪些?
答、string、vector、list、deque、set、map等
68、问sort函数使用需要包含什么头文件?
答、algorithm;如果是在list中的sort,就可以直接用list对象调用。
69、问在使用algorithm中的sort函数进行排序时,正确的用法是什么?
答、sort(v.begin(),v.end());
70、问queue qq;
sort(qq.front(),qq.back());
问这种写法对吗?
答、错误,所有容器的头元素的地址都是qq.begin();尾元素的地址都是qq.end();
71、与vector比较问deque的特点?
答、一种双向开口的连续线性空间(像双端队列),头尾都可以插入或删除。而vector只有一个开口,头插效果差,尾插效果好(像数组)。
72、问string容器常用API有哪些?
答、string();//创建一个空的字符串 例如: string str;      
string(const string& str);//使用一个string对象初始化另一个string对象
string(const char* s);//使用字符串s初始化
string(int n, char c);//使用n个字符c初始化 
string& operator=(const char* s);//char*类型字符串 赋值给当前的字符串
string& operator=(const string &s);//把字符串s赋给当前的字符串
string& operator=(char c);//字符赋值给当前的字符串
string& assign(const char *s);//把字符串s赋给当前的字符串
string& assign(const char *s, int n);//把字符串s的前n个字符赋给当前的字符串
string& assign(const string &s);//把字符串s赋给当前字符串
string& assign(int n, char c);//用n个字符c赋给当前字符串
string& assign(const string &s, int start, int n);//将s从start开始n个字符赋值给字符
char& operator[](int n);//通过[]方式取字符
char& at(int n);//通过at方法获取字符
string& operator+=(const string& str);//重载+=操作符
string& operator+=(const char* str);//重载+=操作符
string& operator+=(const char c);//重载+=操作符
string& append(const char *s);//把字符串s连接到当前字符串结尾
string& append(const char *s, int n);//把字符串s的前n个字符连接到当前字符串结尾
string& append(const string &s);//同operator+=()
string& append(const string &s, int pos, int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾
string& append(int n, char c);//在当前字符串结尾添加n个字符c
int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const;  //查找s第一次出现位置,从pos开始查找
int find(const char* s, int pos, int n) const;  //从pos位置查找s的前n个字符第一次位置
int find(const char c, int pos = 0) const;  //查找字符c第一次出现位置
int rfind(const string& str, int pos = npos) const;//查找str最后一次位置,从pos开始查找
int rfind(const char* s, int pos = npos) const;//查找s最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos, int n) const;//从pos查找s的前n个字符最后一次位置
int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str
string& replace(int pos, int n, const char* s); //替换从pos开始的n个字符为字符串s
/*
compare函数在>时返回 1,<时返回 -1,==时返回 0。
比较区分大小写,比较时参考字典顺序,排越前面的越小。
大写的A比小写的a小。
*/
int compare(const string &s) const;//与字符串s比较
int compare(const char *s) const;//与字符串s比较
string substr(int pos = 0, int n = npos) const;//返回由pos开始的n个字符组成的字符串
string& insert(int pos, const char* s); //插入字符串
string& insert(int pos, const string& str); //插入字符串
string& insert(int pos, int n, char c);//在指定位置插入n个字符c
string& erase(int pos, int n = npos);//删除从Pos开始的n个字符 
//string 转 char*
string str = "itcast";
const char* cstr = str.c_str();
//char* 转 string 
char* s = "itcast";
string sstr(s);


//获得字符串长度?
string str("hello");
str.length();
str.size();
73、vector常用的API有哪些?
答、
v.push_back(s1);//向vector中插入数据。
vector<T> v; //采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身。
vector(n, elem);//构造函数将n个elem拷贝给本身。
vector(const vector &vec);//拷贝构造函数。


//例子 使用第二个构造函数 我们可以...
int arr[] = {2,3,4,1,9};
vector<int> v1(arr, arr + sizeof(arr) / sizeof(int)); 
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
vector& operator=(const vector  &vec);//重载等号操作符
swap(vec);// 将vec与本身的元素互换。
size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
capacity();//容器的容量
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。
at(int idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
operator[];//返回索引idx所指的数据,越界时,运行直接报错
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.
push_back(ele); //尾部插入元素ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素
74、问deque的API有哪些?
答、deque<T> deqT;//默认构造形式
deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);//构造函数将n个elem拷贝给本身。
deque(const deque &deq);//拷贝构造函数。
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
deque& operator=(const deque &deq); //重载等号操作符 
swap(deq);// 将deq与本身的元素互换
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
push_back(elem);//在容器尾部添加一个数据由对象调用
push_front(elem);//在容器头部插入一个数据由对象调用
pop_back();//删除容器最后一个数据由对象调用
pop_front();//删除容器第一个数据由对象调用
at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range。
operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
front();//返回第一个数据。
back();//返回最后一个数据
insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置。
75、问如果person
76、问stu.mName += mNameSeed[i];能成立的原因?已知stu.mName是string类型、mNameSeed也是string类型。
答、string类中存在+=的运算符重载。
77、编写代码,变化vector容器的capacity大小(收缩内存)?
答、
void test05()
{
vector<int> v;
v.resize(100000);
cout << "size:" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;
cout << "-------------" << endl;
v.resize(5);


vector<int>(v).swap(v);


cout << "size:" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;
}
非常重要,可以用来节省空间。
78、编写代码,测试vector容器每次动态分配存储空间,是否会改变首地址?
答、
void test04()
{
int *p = NULL;
int count = 0;
vector<int> v;
//v.reserve(100000);如果预留了100000个空间先,首地址是不会变的。
for (int i = 0; i < 100000; ++i)
{
v.push_back(i);
if (&v[0] != p)
{
++count;
p = &v[0];
}
}


cout << "size:" << v.size() << endl;
cout << "capacity:" << v.capacity() << endl;
cout << "count = " << count << endl;


//在大致知道存储多少元素的情况下, 可以提前申请内存
}
79、string容器中的find函数返回类型是什么?问string s;cout<<s.find('a');结果是什么?string s;int a=s.find('a');cout<<a;问结果是什么?
答、size_t;实际上是一个unsigned int型。返回结果是-1的无符号整型数,非常大的数。
结果是-1;
80、string中插入、删除函数是什么?
答、insert、erase
81、问string中截取字符串的函数是什么?
答、substr。
82、问string中compare函数的返回值是怎样的?
答、>时返回1,<时返回-1;=时返回0;
83、问string容器(类)中有没有重载=、>、<、等算符?
答、有
84、问erase函数执行后,有没有删除容器的空间,还是只是删除了值?
答、没有删除,capacity不变,注意string也是容器。
85、举出string容器引用失效的案例?
答、void test10()
{
string s = "aaaa";
cout << (int)&s[0] << endl;


char &ref = s[0];


s += "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
cout << (int)&s[0] << endl;


ref = 'p';
}
86、问类可不可以是容器?
答、可以
87、srand()应该在哪设置?
答、函数体内。
88、问vector能随机访问吗?
答、可以。
89、问如果在多处出现了相同的语法错误,只改了一个,结果报同样的错误,说明改错了吗?
答、不是,必须将所有的语法都改好,再试一下,进一步确定。
90、问向vector容器定义的对象中输入数据,语法是?
答、v.push_back(20);
91、
class Perosn
{


};
问分号要不要加?
答、必须加,不然报错。
92、给出用自定义函数作为回调函数的参数,用来遍历vector容器中的数据。给出用函数对象(反函数)调用vector中自定义的遍历函数遍历vector容器中的数据。
void myPrintint(int val)
{
cout<<val<<endl;
}


for_each(v.begin(),v.end(),myPrintint);




struct MyPrintFunctorInt
{
void opeartor()(int i)
{
cout<<i<<" ";
}


};
for_each(v.begin(),v.end(),MyPrintFunctorInt());(for_each是vector容器中的成员函数).
93、问vector插入元素是头插还是尾插?
答、尾插,只有一个出口供插入元素和删除元素。
94、问用记事本编写c++程序,如何判断括号是中文的还是英文的?
答、中文的括号占位比较多。
95、sort(v.begin(),v.end())
问如果容器v中是person对象,能直接运行成功吗?如何修改?
答、不能,可以在person对象中重载一个public权限的<号函数,指定比较的方式,也可以使用回调函数。
96、重载<号返回值是什么?
答、bool类型。
97、问sort(dscores.begin(),dscores.end())?是按什么方式排序?如何相反方式排序?
答、按升序,可以通过添加回调函数。
98、问queue有容量的概念吗?
答、没有。
99、vector<int>v;
reserve(100);
resize(4);
vector<int>(v).swap(v);
问这段代码的作用?
答、在执行vector<int>(v).swap(v)之前,v中size大小为4,capacity100;
vector<int>(v)调用类的默认构造函数,初始化size为4,capacity 为4的匿名对象,再与v交换,
但是匿名对象执行完一行就会释放,所以达到将一个容器的capacity缩小的作用。
100、问reverse()函数有什么好处?
答、合理使用可以提高效率。
101、如果容器中没有空间,push_back还能运行吗?
答、可以。会构造空间,再分配数据。
102、问resize()和reserve()的区别?
答、当使用resize()时会初始化容器的数据与resize的参数个数相同,当resize的参数小于size时,多出的元素会被丢弃,但是capacity不会改变,
当resize的参数大于size时,会初始化元素,capacity也会改变,会开辟内存空间;reserve只会改变capacity内数据大小,而不会改变size的大小。
reserve函数使用时当参数小于capacity时,不会改变capacity;如果大于capacity,会扩充capacity的值。
103、问vector容器动态增加大小的方式是什么?
答、开辟一块更大的内存空间,将原数据拷贝到新空间,并释放原空间。
104、问v.rend()、v.end()、v.start()、v.rstart()是什么?
答、获得容器首元素、尾元素的指针。加r是相反的意思,例如v.rend()实际上指向的是v.start()指向的元素,而且++后按1、2、3、的顺序获得元素地址;
v.rstart()实际上指向的是v.end()指向的元素,而v.rstart()经过++后按3、2、1的顺序获得元素的地址。
105、问vector的本质是什么?
答、单口数组。
106、问string是什么?
答、容器。
107、注意引用失效,参考代码
答、待处理。
108、问如何将string类型的变量转换成const char *类型变量?
答、string中有成员函数c_str();
109、问string s=“helloo world”;
s[i]和s.at(i);使用功能和优缺点?
答、使用都是获得下标为i的字符,但是s[i]下标越界后,程序不能执行,且不会抛异常,但是s.at(i)就会抛出异常,可以用try catch方式处理。
110、问string a="helloworld";
如果a后面的字符串比较长,存放在什么地方?
答、存放在堆上;如果字符串比较短,存放在栈上。当"hello"比较长时(例如16个)实际上对象a中会将其放在堆空间中,只存放堆空间的首地址。
111、问Person("ll",20);和 Person p1("ll",20)有什么区别?
答、前者创建的是匿名对象,后者创建的是一个p1对象。
112、问
for(int val:v)
{
cout<<val<<" ";
}


for(auto val:v)
{
cout<<val<<" ";
}
这两个个语法正确吗?所有编译器都能适用?auto的作用是什么?
答、正确,相当于for(vector<int>::iterator it=v.begin();it!=v.end();++it)
{
cout<<*it<<endl;
}
不是,auto能制动堆导类型,所以val类型会变成int。
待补全。
113、问
vector<int> v;
v.push_back(10);
vector<int>::iterator r=v.begin();
分析各句的含义?
答、
114、问对于++、--运算符重载,最好优先使用前置还是后置?
答、后置会产生临时对象,效率较低,使用前置就不会产生这种情况。
115、问容器、算法、迭代器之间的关系?
答、容器提供迭代器、算法使用容器提供的迭代器。
116、问STL的创建者是哪国人?
答、俄罗斯。
117、问STL存在什么地方?
答、内建于编译器。
118、仿函数的本质是什么?
答、重载了operator()的class或者class template。
119、问迭代器的本质是什么?作用是什么?
答、作用是遍历容器中的元素。对于链表和数组的遍历方法是不一样的,迭代器就是为了封装这种差异,对用户来说底层实现方法未知。
120、问算法分成多少种?其本质是什么?
答、本质是函数模板。
121、问容器分成多少种?其本质是什么?
答、主要是五种:本质是类模板。
122、问STL的六大组件是哪些?
答、容器、算法、迭代器、仿函数、适配器、空间配置器。
123、各种不同版本的STL有什么特点?
答、都是根据惠普的STL开发的。
124、问stl的本质?
答、c++的标准库。占标准库的%80
125、问如何放大缩小文档?
答、ctrl+滚轮滑动。
126、问二进制文件中,如何设置文件指针?
答、ifs.seekg(sizeof(Person),ios::beg);
127、问如何在vim中移动到一行的行首?
答、nG,通过加行号指定跳到某一行的行首。^,通过命令行输入^从行尾跳转到行首。home键也可以。
128、问如何在vim中移动到一行的末尾?
答、命令行模式输入$.(可在命令前加行号,跳到指定行的末尾);
129、问
while (ifs.get(buf,1))
{
cout << buf << endl;
memset(buf, 0, 1024);
}
ifs是文件流对象,而且文件中有多行数据,能顺利执行吗?
答、不能,立即退出循环,因为1会被减去1,然后fail状态被置1,退出循环。可以通过转定义查看得出结论。
130、问getline函数一定非得指定'\n'为读的结束标志吗?
答、不是,可以指定任意字符。
131、问
while (ifs.get(buf,1024))
{
cout << buf << endl;
memset(buf, 0, 1024);
}
ifs是文件流对象,而且文件中有多行数据,能顺利执行吗?
答、不能,造成死循环。因为get(buf,1024)不会将文件中的换行符放在buf中。而是留在缓冲区中,只有,get()函数可以读取\n。
132、问cout.write(buf,2).write(buf,1)的作用?
答、将buf中的字符,打印2个到标准输入输出。由于write的函数返回类型任然是cout所属类。所以可以连续使用。
133、问cout.put(‘a’)的作用,以及cout所属类中put函数的返回类型是什么?
答、向标准输入输出打印'a'字符,put函数返回类型是cout所属输入输出类。
134、
char ch = cin.peek(); //asd
cout << "ch = " << ch << endl;
ch = cin.get();
cout << "ch = " << ch << endl;


//再把ch放回去
cin.putback(ch);


char buf[1024] = { 0 };
cin.getline(buf, 1024);
cout << "buf:" << buf << endl;
问putback的功能?
答、将ch变量中的字符放回缓冲区。
135、问
char ch = cin.peek(); //asd
cout << "ch = " << ch << endl;
ch = cin.get();
cout << "ch = " << ch << endl;
的输出结果是什么?
答、a
a、
说明peek()函数可以看到缓冲区第一个字符的个数,而且不拿取数据。
同时要求用户从标准输入输出设备输入数据。


134、问
cin.ignore(2); //asd
char ch = cin.get();
cout << "ch = " << ch << endl;
输入asd输出结果是什么?说明了什么?
答、输出结果是d;说明ignore函数有忽略字符的功能,参数2是忽略的字符个数。
135、
 char buf[1024]={0};
 36     cin.get(buf,1024);
 37 
 38     while(1)
 39     {
 40         cout<<"buf:"<<buf<<endl;
 41         char ch=cin.get();
 42         if(ch=='\n')
 43         {
 44             cout<<"换行符还在缓冲区!"<<endl;
 45         }
 46     }
问,如果从屏幕输入1234,输出结果是什么?
答、1234
换行符还在缓冲区
1234
然后必须从屏幕接收一个字符才能让程序正常执行。
136、问
cout.fill('*');
cout.width(10);
//cout << setiosflags(ios::left) << 123.45666666 << endl;
cout  << 123.45666666 << endl;
结果是什么?
答、***123.457;说明默认数字是向右对齐10个空格的。
137、

cout  << 123.45666666 << endl;
输出结果说明什么?
答、123.457;说明对于小数,cout输出时会自动进行四舍五入的。
138、
运行以下程序,则输出结果是(   )。
int main() {
cout.fill('*');
cout.width(10);
cout << setiosflags(ios::left) << 123.45 << endl;
}
(20分)
 A 、 ****123.45
 B 、 **123.45**
 C 、 123.45****
 D 、 ***123.45*
答、选C。
139、
2.已知:
#include <iostream>
using namespace std;
class S {
public:
~S() { cout << "S "; }
};
char fun()
{
S s1;
throw('T');
return 'O';
}
int main()
{
try { cout << fun(); }
catch (char c) { cout << c; }
}
程序输出结果为(   )。
(20分)
 A 、 S T
 B 、 O S T
 C 、 O T
 D 、 T
问答案是?
答、A。先运行try内的fun();并进入fun(),运行到throw('T'),然后catch中的c会接受'T',但是fun()就结束运行,且不会运行return 'o'。
说明,一旦进入throw后,运行异常的函数就不执行了。
140、问cin.ignore(2)的作用?
答、从标准输入输出读数据时忽略两个字符。再调用cin.get()函数,会将前两个数据忽略,直接读下一个数据。
141、问cin.get(buf,1024)的作用?
答、从标准输入输出读数据到内存的buf中,但是从标准输入输出输入数据时会在其和内存之间开辟缓冲区暂存数据,而且从其输入的作为
输入结束标志的换行符会被存放到缓冲区中,但是不会被写入buf中。如果\n没有用其它方式拿走,下次调用get时,会陷入死循环,因为get(buf,1024)不能将
\n从缓冲区读入到内存,如果用get()就可以。
142、问冒泡排序第一个for循环的作用是什么?
答、记录要排序的元素的个数。每一次外循环完成,确定一个元素的位置。
143、问如果局部类对象被定义且是存放在堆空间中,怎样释放?
答、借助智能指针。
144、问java为什么比c++火?
答、因为java库比c++多。
145、在c++异常中,捕获所有异常的catch()中参数是?
答、...
146、问如果类中存在指针,还能按通常的方法将类对象读到文件中吗?
答、不能。万一指针指向堆空间,是不能将堆空间中数据放入文件。
147、问怎样利用seekg进行数据偏移?
答、ifs.seekg(sizeof(Person),ios::beg);
148、问磁盘和标准输出、输入之间能不能直接交换数据?
答、不能,必须通过内存作为中介,交换数据,重要。
149、Person person[3]{Person("aaa",10),Person("bbb",20),Person("ccc",30)}
问这样写行吗,如果在堆上呢?
答、这样写可以,如果在堆上不行。称为聚合初始化。
150、问string name="kdjfkkjksafdkjkjkjkjkjkjkjkjkjkdfskjalkjj"会出错吗?错误
答、可能出错,因为超过了string内中定义的长度上限。所以一般用char *代替。
151、问stl都一样吗?
答、STL分版本,虽然接口一样,但是实现不一样。
152、问ostream是什么流?istream是什么流?
答、写文件到磁盘,读文件到内存。
153、怎样将文件指针放到文件开始?怎样清除文件的eof标志?
答、ifs.seekg(o,ios::beg)(但是必须要保证无eof标志);ifs.clear()(清除eof标志)。
154、问c++中创建的io对象,有几个状态?为什么要在对象中添加这些状态数据?
答、四个状态。good、bad(硬件错误等系统级错误,不能被修复)、eof(读到文件尾,eof才会变为true)、fail(软件错误不正确调用成员函数,或者试着去将非int的数据转成int)
156、问ofs.close()的作用是什么?
答、关闭文件流并刷新缓冲区。
157、程序中有strcpy,要怎么避免出现CRT_SECURE_NO_WARNINGS?
答、添加#define _CRT_SECURE_NO_WARNINGS
158、怎样很好地理解一份代码?
答、写注释。
159、问使用控制符对cout流控制要使用什么头文件?
答、iomanip。
160、问ifstream ifs("./tex.txt",ios::in);
ifs>>buf;能不能运行(buf是缓冲区)能意味什么?
答、能,说明重载了>>运算符。
161、问ifstream ifs("./tex.txt",ios::in);
返回类型是什么?
答、布尔类型,打开失败返回false,成功返回true。
162、问读文件对象创建语句?
答、ifstream ifs("./tex.txt",ios::in);(没有ios::in,默认是读)
ifstream ifsifs;
ifs.open("./text.txt");默认是读。
163、问在c++中fstream有没有继承iostream类?有什么好处?
答、有,所以可以利用<<及>>运算符。
164、问int main()
{
printf("ass");
pause();
return 0;
}
在Linux上能打印ass吗?
答、不能。pause()函数的头文件是#include<unistd.h>
165、问linux上和system("pause")同样功能函数是什么?
答、pause();
166、问
char buf[1024];
cin.get(buf,1024);
cout<<buf<<endl;


如果从屏幕输入一行并有换行,问buf中有没有换行?
答、没有。如果再用cin.get();获得的是'\n'。
167、问
char ch=cin.get();
cout<<"ch="<<ch<<endl;
ch=cin.get();
cout<<"ch="<<ch<<endl;
运行结果?解释运行机制?
答、
168、问cerr标准输入输出有缓冲区吗?
答、没有。
167、问i开头的标准输入输出是表示写、还是读;o开头的标准输入输出类呢?
答、输入(向内存)、输出(从内存)
168、endl的作用有哪些?
答、输出换行;刷新缓冲区。
169、问c++中输入和输出是从什么角度定义的?
答、内存。
170、问磁盘和内存间的缓冲区在哪?操作系统中对磁盘操作的函数有缓冲区?磁盘和内存间缓冲区的作用?
答、在内存、没有,直接操作磁盘、提高了效率,减少磁盘的对写次数。一般磁盘都有个读或写次上限。


171、问过多使用异常造成什么影响?
答、降低了程序的效率。
172、问在实现多态时,基类析构函数乣如何处理?
答、必须定义成虚析构函数,防止,在用基类指针指向子类对象时,子类对象的析构函数不能运行。
173、void func()
{
throw new Person();
}


void test01()
{
try
{
  func();
}catch(Perosn *p1)
{
  p1->print();
}


}
问运行机制?
答、
174、void func()
{
throw &(Person());
}


void test01()
{
try
{
  func();
}catch(Perosn *p1)
{
  p1->print();
}


}
问运行机制?
答、
175、void func()
{
throw Person();
}


void test01()
{
try
{
  func();
}catch(Perosn &p1)
{
  p1.print();
}


}
问运行机制?
答、
175、void func()
{
throw Person();
}


void test01()
{
try
{
  func();
}catch(Perosn p1)
{
  p1.print();
}


}
问运行机制?
答、
176、拷贝构造函数怎么写,参数必须是引用吗?
答、Person(const Person &){};
177、问编译器在编译阶段能不能确定变量的类型?有没有用到变量的类型?
答、不能确定变量的类型,但是可以根据变量的类型,确定该为变量分配多大的内存空间。所以使用到变量的类型。
178、如何指定函数不调用任何类型的异常?
答、通过throw()的方式。
179、问,什么类型的编译器对c++标准异常规范忽略?什么类型又支持得很好?
答、vs编译器忽略,但是g++不会,所以自定义异常时,就会按c++标准异常规范的方式运行。而不是自定义。
180、什么是栈解旋?
答、void FUNC()
{
Person p1;
Person p2;
throw 1;
}


调用FUNC();会释放函数中的局部变量,称为栈解旋。即使就是局部变量的释放。
181、问c++中,是通过什么进行异常匹配的?
答、类型。
182、问在c++中,单独编写"abcde",这是什么类型数据?
答、char *型。不是string型。除非用string("abcde")的方式转换为string类型。(该处调用了string类的构造函数,并创建了一个匿名对象。)
183、问c++中用于类型转换的语法关键字都都少种?
答、四种、const_cast、static_cast、dynamic_cast、reinterpret_cast.
184、所有c语言的类型转换,都可以用c++的类型转换语法转换?
答、对。
185、问reinterpret_cast是什么?
答、用于将两种不一样的类型之间进行转换,一般用于内键的int、double、char等等类型之间转换。
186、问用const修饰的指针变量或引用如何转换成非const的?
答、
187、问编译阶段能确定变量的类型吗?
答、不能。
188、问在多态时,如果基类指针指向子类对象,使用基类指针访问虚函数是通过什么机制调用子类的虚函数的?
答、Base *p=new Derived;
Derived对象被创建后,有一个vptr指针,p可以访问vptr指针,但是这个vptr指针指向的内存空间中中即父类中未与子类重名的虚函数,
也有重名的但是是子类的虚函数。所有能通过vptr指针调用到子类的虚函数。注意这个vptr指针变量的位置是在对象内存的开始位置。
189、动态类型转换和静态类型转换哪种转换常用?
答、动态类型转换。
190、问动态类型转换能允许向下类型转换吗?
答、能,但是需要多态,没有多态只能进行向上类型转换。如果有多态就可以进行向下类型转换。
191、问动态类型转换和静态类型转换的关键字是什么?
答、dynamic_cast;static_cast;
192、问什么是向下类型转换,什么是向上类型转换?哪种转换是安全的?
答、向下类型转换是指向基类对象的基类指针被转换为指向子类对象的子类指针。例如
Animal *animal=new Animal;向下类型转换是不安全的;向上类型转换是安全的。
Dog *dog=static_cast<Dog*>(animal);
192、给出基础类型数据间的静态类型转换的实例?
答、int a=10;
char b=static_cast<char>(a);
193、问给出静态转换的实例?
答、Animal *animal=NULL;Dog *dog=NULL;Dog *dd=static_cast<Dog *>(animal);
194、问不同类型的类指针之间能转换吗?
答、不能。
195、问在类中,类型转换的要求是什么?
答、只能在有继承关系的父类和子类指针之间或引用之间。(除了基础类型)。
196、对于类型不能在动态阶段确定的,静态类型转换能成功吗?
答、不能,例如多态的父类指针指向子类对象。
197、问静态类型转换在什么时候转换?动态类型转换在什么转换?
答、编译的时候。运行时类型转换。
198、问c++中类型转换能够过多使用吗?
答、不建议使用类型转换。
199、
问c++开发中类型之间转换,比较常用的转换是什么?
答、指针之间或引用之间。
200、问有时候qt的ui设计中,无法添加button按钮,可能的原因?
答、开了太多文件。
201、问什么是显示类型转换和隐式类型转换?
答、显示类型转换是使用例如(char *)类型对另一个不是char *类型的变量进行转换这就是显示类型转换;如果不加char *就是隐式类型转换。
202、问添加explicit的函数的特点?
答、添加了explicit修饰的函数,该函数的形参不能进行隐式类型转换。
203、问boost是什么?
答、通常指一个网站,提供了许多c++程序库。
204、问什么是内置类型?
答、int、double、float、char、bool等。
205、问在类的构造函数的初始化列表中为类的成员赋值和在类的构造函数的本体中对类的成员赋值哪种被称为对类的成员变量进行初始化?哪种效率高?
答、第一种。初始化列表的效率高。
206、问位于不同的编译单元的non-local-static对象的初始化顺序再c++中是如何决定的?如何避免这里隐藏的问题?
答、c++编译也没法指定。可以将每个non-local static 对象搬到自己的专属函数内b并用static修饰,并由这个函数返回。这被称为reference-returning函数。
这里的non-local-static对象是指(该对象是global或位于namespace作用域内,抑或在class或file作用域内被声明为static。
207、问什么是local static对象?
答、函数内的static对象。
208、问在多线程环境下,如何保证函数的static变量造成的麻烦问题?
答、通过referenc-returning函数使用static变量,
209、任何一个class类带有virtual函数,几乎确定应该也有一个virtual析构函数?
答、对。
210、为什么不要随便为类添加virtual析构函数?
答、如果没有虚函数,析虚构函数就没必要设置。virtual析构函数会让每个对象内都保存vptr指针,增加了对象的内存空间。
211、问构造函数和析构函数内能不能调用virtual函数?
答、不能调用。使用可能会造成预想不到的后果。
212、问如何保证Widget&widget::operator=(const widget & rhs)运行时不会rhs就是this指向的对象而产生“自我赋值”?
答、在函数内进行证同测试。例如:if(this==&rhs)return *this.
213、问在程序中遇到的常见的内存资源有哪些?它们会带来内存泄漏问题吗?
答、堆空间、文件描述符、互斥锁、图形界面中的字型和笔刷、数据库连接、网络sockets。
会。
214、问对于c++中的资源,最好的避免因为未释放资源而造成的内存泄漏问题的策略是什么?
答、将资源放到对象中。利用对象的析构函数自动释放。例如智能指针。
215、问智能指针的一个最大特点是什么?
答、auto_ptr<Investment>pInv1(createInvestment());
auto_ptr<Investment>pInv2(pInv1);//pInv1会被设为null,pInv2会指向原pInv1的对象。


pInv1=pInv2;//pInv1会指向pInv2的对象,pInv2会被设为null。


用一句话表示就是:若通过copy构造函数或copy assignment操作符复制它们,被复制指针会变成null,将指针所指对象传递给另一个对象。
216、问什么是RCSPs?
答、引用计数型智慧指针(reference-counting smart pointer).是普通智能指针的加强版,不会出现215中的问题,而且在无人指向它所指向的对象时,对象会自动被销毁。
217、问什么是软件设计?
答、"令软件做出你希望它做的事情"的步骤和做法。
216、所有容器的迭代器中end()都是指向容器内最后一个元素的后一个位置?
答、对。
218、服务器开发中经常要使用异常处理机制?
答、正确。


219、写一段业务代码,再考虑封装。


220、问list删除某个元素?
答、a.erase(it);


221、问for(list<ApplicationWidget*>::iterator itor=it;itor!=vApW.end();itor++)
        {
            delete(*itor);
            vApW.erase(itor);
        }这段代码有什么问题?
答、itor已经erase掉,不能再加加。


222、问ifstream特点,将文件从硬盘读到内存。


223、string查找失败返回什么?
答、string::npos;


224、
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值