//professional c++ 4th edition p 224 2020年05月07日 05时10分26秒
#include
#include
std::string getString(){
return “Hello World!”;}
class MyClass{ // p225
public:
MyClass(int& ref) : mRef(ref) { }
private:
int& mRef;
};
void swap(int& first, int& second){
int temp = first;
first = second;
second = temp;
}
//
void handleMessage(std::string&& message){
std::cout << "handleMessage with lvalue reference: " << std::endl;
}
void refcall(int& t) { ++t;}
int main(){
const std::string& string2 = getString();
int x = 3, y = 4;
//引用变量在创建时必须初始化
//xRef 就是x的另一个名称, 使用xRef就是使用x的当前值, 对xRef赋值会改变x的值
int& xRef = x;
xRef = y;//Changes value of x to 4. Doesn’t make xRef refer to y.
//y的地址是一个指针, xRef被声明为一个指向int值的引用, 不是指向指针的引用
//xRef = &y; DOES NOT COMPILE!
int z = 5;
int & zRef = z;
zRef = xRef; //Assigns values, not references
//没有改变zRef, 只是将z的值设置为3, 因为xRef 指向x, x的值是3
int* intP;
//ptrRef 是一个指向intP的引用, intP是一个指向int值的指针
int*& ptrRef = intP;
ptrRef = new int;
//修改ptrRef 会更改intP
*ptrRef = 5;
//对引用 取地址的结果 与 对被引用变量 取地址的结果相同
int* xPtr = &xRef;//Address of a reference is pointer to value
*xPtr = 100;
//通过取x引用的地址, 是xPtr指向x. 将*xPtr赋值为100, x的值也变为100
int i = 123;
MyClass m(i);
swap(x, y);
//对指针解除引用, 将指针"转换"为引用 p226
int *xp = &x, *yp = &y;
swap(*xp, *yp);
//要支持此类调用, 需要一个接受右值引用的版本
handleMessage("Hello World");
std::string a = "Hello ";
std::string b = "World";
handleMessage(a + b);
// //试图执行时会崩溃 显示 段错误 p227
// int* ptr = (int*)8;
// refcall(ptr);
return 0;
}
/
wannian07@wannian07-PC:~$ g++ -std=c++17 -o c17 c17.cpp
wannian07@wannian07-PC:~$ ./c17
handleMessage with lvalue reference:
handleMessage with lvalue reference:
//professional c++ 4th edition p 228
#include
void separateOddsAndEvens(const int arr[], size_t size, int** odds,
size_t* numOdds, int** evens, size_t* numEvens){
*numOdds = *numEvens = 0;
for(size_t i = 0; i < size; ++i){
if(arr[i] % 2 == 1){
++(*numOdds);
} else{
++(*numEvens);
}
}
*odds = new int[*numOdds];
*evens = new int[*numEvens];
size_t oddsPos = 0, evensPos = 0;
for(size_t i = 0; i < size; ++i){
if(arr[i] % 2 == 1){
(*odds)[oddsPos++] = arr[i];
} else{
(*evens)[evensPos++] = arr[i];
}
}
}
int main(){
int unSplit[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int* oddNums = nullptr;
int* evenNums = nullptr;
size_t numOdds = 0, numEvens = 0;
separateOddsAndEvens(unSplit, std::size(unSplit),
&oddNums, &numOdds, &evenNums, &numEvens);
delete[] oddNums; oddNums = nullptr;
delete[] evenNums; evenNums = nullptr;
return 0;
}
*/
//professional c++ 4th edition p 229
#include
#include
#include
// void separateOddsAndEvens(const std::vector& arr,
// std::vector& odds, std::vector& evens){
// for(int i : arr){
// if(i % 2 == 1){
// odds.push_back(i);
// }else{
// evens.push_back(i);
// }
// }
// }
std::pair<std::vector, std::vector>
separateOddsAndEvens(const std::vector& arr){
std::vector odds, evens;
for(int i : arr){
if(i % 2 == 1){
odds.push_back(i);
}else{
evens.push_back(i);
}
}
return make_pair(odds, evens);
}
int main(){
std::vector vecUnSplit {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// std::vector odds, evens;
// separateOddsAndEvens(vecUnSplit, odds, evens);
auto[odds, evens] =separateOddsAndEvens(vecUnSplit);
return 0;
}